LINQ to XML 및 DOM 비교

이 문서에서는 LINQ to XML과 현재 주로 사용되는 XML 프로그래밍 API인 W3C DOM(문서 개체 모델)의 몇 가지 주요 차이점을 설명합니다.

XML 트리를 생성하는 새로운 방법

W3C DOM에서는 상향식으로 XML 트리를 빌드합니다. 즉, 문서를 만들고 요소를 만든 다음 요소를 문서에 추가합니다.

예를 들어 다음 예제에서는 Microsoft의 DOM 구현 XmlDocument을(를) 사용하여 XML 트리를 만드는 일반적인 방법을 사용합니다.

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
XmlElement phone1 = doc.CreateElement("Phone");
phone1.SetAttribute("Type", "Home");
phone1.InnerText = "206-555-0144";
XmlElement phone2 = doc.CreateElement("Phone");
phone2.SetAttribute("Type", "Work");
phone2.InnerText = "425-555-0145";
XmlElement street1 = doc.CreateElement("Street1");
street1.InnerText = "123 Main St";
XmlElement city = doc.CreateElement("City");
city.InnerText = "Mercer Island";
XmlElement state = doc.CreateElement("State");
state.InnerText = "WA";
XmlElement postal = doc.CreateElement("Postal");
postal.InnerText = "68042";
XmlElement address = doc.CreateElement("Address");
address.AppendChild(street1);
address.AppendChild(city);
address.AppendChild(state);
address.AppendChild(postal);
XmlElement contact = doc.CreateElement("Contact");
contact.AppendChild(name);
contact.AppendChild(phone1);
contact.AppendChild(phone2);
contact.AppendChild(address);
XmlElement contacts = doc.CreateElement("Contacts");
contacts.AppendChild(contact);
doc.AppendChild(contacts);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
Dim phone1 As XmlElement = doc.CreateElement("Phone")
phone1.SetAttribute("Type", "Home")
phone1.InnerText = "206-555-0144"
Dim phone2 As XmlElement = doc.CreateElement("Phone")
phone2.SetAttribute("Type", "Work")
phone2.InnerText = "425-555-0145"
Dim street1 As XmlElement = doc.CreateElement("Street1")
street1.InnerText = "123 Main St"
Dim city As XmlElement = doc.CreateElement("City")
city.InnerText = "Mercer Island"
Dim state As XmlElement = doc.CreateElement("State")
state.InnerText = "WA"
Dim postal As XmlElement = doc.CreateElement("Postal")
postal.InnerText = "68042"
Dim address As XmlElement = doc.CreateElement("Address")
address.AppendChild(street1)
address.AppendChild(city)
address.AppendChild(state)
address.AppendChild(postal)
Dim contact As XmlElement = doc.CreateElement("Contact")
contact.AppendChild(name)
contact.AppendChild(phone1)
contact.AppendChild(phone2)
contact.AppendChild(address)
Dim contacts As XmlElement = doc.CreateElement("Contacts")
contacts.AppendChild(contact)
doc.AppendChild(contacts)
Console.WriteLine(doc.OuterXml)

이 코딩 스타일은 XML 트리의 구조를 숨깁니다. LINQ to XML은 구조체를 더 효과적으로 보여주는 대체 접근 방식인 기능적 구성도 지원합니다. 이 접근 방식은 XElementXAttribute 생성자를 사용하여 수행할 수 있습니다. Visual Basic에서는 XML 리터럴을 사용하여 수행할 수도 있습니다. 이 예제에서는 함수 생성을 사용하여 동일한 XML 트리를 생성하는 방법을 보여 줍니다.

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144",
                new XAttribute("Type", "Home")),
            new XElement("phone", "425-555-0145",
                new XAttribute("Type", "Work")),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Dim contacts = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone Type="Home">206-555-0144</Phone>
            <Phone Type="Work">425-555-0145</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

XML 트리를 생성하는 코드의 들여쓰기는 기본 XML의 구조를 나타냅니다. Visual Basic 버전은 XML 리터럴을 사용합니다.

자세한 내용은 XML 트리를 참조하세요.

XML 요소로 직접 작업

XML을 사용하여 프로그래밍하는 경우 XML 요소를 대개 집중적으로 다루고 특성도 집중적으로 다룰 수 있습니다. LINQ to XML에서는 XML 요소 및 특성으로 직접 작업할 수 있습니다. 이러한 기능으로 다음을 수행할 수 있습니다.

  • 문서 개체를 전혀 사용하지 않고 XML 요소를 만듭니다. 이에 따라 XML 트리의 조각으로 작업해야 하는 경우 프로그래밍이 단순해집니다.
  • XML 파일에서 T:System.Xml.Linq.XElement 개체를 직접 로드합니다.
  • T:System.Xml.Linq.XElement 개체를 파일이나 스트림으로 serialize합니다.

이와 비교할 때 W3C DOM에서는 XML 문서가 XML 트리의 논리 컨테이너로 사용됩니다. DOM에서 요소 및 특성을 비롯한 XML 노드는 XML 문서의 컨텍스트에서 만들어져야 합니다. DOM에서 이름 요소를 만드는 코드의 조각은 다음과 같습니다.

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
doc.AppendChild(name);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
doc.AppendChild(name)

여러 문서에서 요소를 사용하려면 여러 문서의 노드를 가져와야 합니다. LINQ to XML은 이러한 복잡성 레이어가 필요 없습니다.

LINQ to XML을 사용할 때 문서의 루트 수준에서 주석이나 처리 명령을 추가하려는 경우에만 XDocument 클래스를 사용합니다.

이름 및 네임스페이스의 기본 처리

이름, 네임스페이스 및 네임스페이스 접두사의 처리는 대개 XML 프로그래밍의 복잡한 부분입니다. LINQ to XML은 네임스페이스 접두사를 처리해야 하는 요구 사항을 제거하여 이름과 네임스페이스를 간소화합니다. 네임스페이스 접두사를 제어하고 싶으면 제어할 수 있습니다. 그러나 네임스페이스 접두사를 명시적으로 제어하지 않기로 결정하는 경우 LINQ to XML은 필요한 경우 serialization 중에 네임스페이스 접두사를 할당하거나, 그렇지 않은 경우 기본 네임스페이스를 사용하여 직렬화합니다. 기본 네임스페이스가 사용되는 경우 생성되는 문서에는 네임스페이스 접두사가 없습니다. 자세한 내용은 네임스페이스 개요를 참조하세요.

DOM의 또 다른 문제는 노드 이름을 변경할 수 없다는 것입니다. 대신 새 노드를 만들고 모든 자식 노드를 새 노드에 복사해야 하므로 원래 노드 ID가 손실됩니다. LINQ to XML은 노드에서 XName 속성을 설정할 수 있도록 하여 이 문제를 방지합니다.

XML을 로드하기 위한 정적 메서드 지원

LINQ to XML을 사용하면 인스턴스 메서드 대신 정적 메서드를 사용하여 XML을 로드할 수 있습니다. 이에 따라 로드와 구문 분석이 간단해집니다. 자세한 내용은 파일에서 XML을 로드하는 방법을 참조하세요.

DTD 구문에 대한 지원 제거

LINQ to XML은 엔터티 및 엔터티 참조에 대한 지원을 제거하여 XML 프로그래밍을 더욱 간소화합니다. 엔터티의 관리는 복잡하므로 드물게 사용됩니다. 이러한 지원 기능을 제거하면 성능이 향상되고 프로그래밍 인터페이스가 간단해집니다. LINQ to XML 트리가 채워지면 모든 DTD 엔터티가 확장됩니다.

조각에 대한 지원

LINQ to XML은 XmlDocumentFragment 클래스에 해당하는 항목을 제공하지 않습니다. 그러나 대부분의 경우 XmlDocumentFragment 개념은 XNodeIEnumerable<T> 또는 XElementIEnumerable<T>(으)로 형식이 지정된 쿼리의 결과에 의해 처리될 수 있습니다.

XPathNavigator에 대한 지원

LINQ to XML은 System.Xml.XPath 네임스페이스의 확장 메서드를 통해 XPathNavigator에 대한 지원을 제공합니다. 자세한 내용은 System.Xml.XPath.Extensions를 참조하세요.

공백 및 들여쓰기에 대한 지원

LINQ to XML은 DOM보다 더 간단하게 공백을 처리합니다.

일반적인 시나리오는 들여쓰기된 XML을 읽고, 공백 텍스트 노드 없이 메모리 내 XML 트리를 만들고(즉, 공백을 유지하지 않음), XML에서 일부 작업을 수행한 후 들여쓰기를 사용하여 XML을 저장하는 것입니다. 서식이 있는 XML을 serialize하는 경우 XML 트리의 유효 공백만 유지됩니다. 이는 LINQ to XML의 기본 동작입니다.

다른 일반적인 시나리오는 이미 의도적으로 들여쓴 XML을 읽고 수정하는 것입니다. 이 들여쓰기를 변경하려고 하지 않을 수 있습니다. LINQ to XML에서는 다음을 통해 이 작업을 수행할 수 있습니다.

  • XML을 로드하거나 구문 분석할 때 공백을 유지합니다.
  • XML을 직렬화할 때 서식을 사용하지 않도록 설정합니다.

LINQ to XML은 DOM처럼 특수한 Whitespace 노드 형식이 아닌 XText 노드로 공백을 저장합니다.

주석에 대한 지원

LINQ to XML 요소는 확장 가능한 주석 집합을 지원합니다. 이러한 지원은 스키마 정보, 요소가 UI에 바인딩되어 있는지 여부 또는 다른 종류의 애플리케이션 관련 정보와 같은 요소에 대한 기타 정보를 추적하는 데 유용합니다. 자세한 내용은 LINQ to XML 주석을 참조하세요.

스키마 정보에 대한 지원

LINQ to XML은 System.Xml.Schema 네임스페이스의 확장 메서드를 통해 XSD 유효성 검사를 지원합니다. XML 트리가 XSD를 준수하는지 확인할 수 있으며, PSVI(Post-Schema-Validation Infoset)를 사용하여 XML 트리를 채울 수 있습니다. 자세한 내용은 XSD를 사용하여 유효성을 검사하는 방법Extensions를 참조하세요.

참고 항목