이 문서에서는 LINQ to XML과 현재 주요 XML 프로그래밍 API인 W3C DOM(문서 개체 모델)의 몇 가지 주요 차이점을 설명합니다.
XML 트리를 생성하는 새로운 방법
W3C DOM에서는 아래에서 위로 XML 트리를 빌드합니다. 즉, 문서를 만들고, 요소를 만든 다음, 해당 요소를 문서에 추가합니다.
예를 들어 다음 예제에서는 DOM XmlDocument의 Microsoft 구현을 사용하여 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은 구조를 더 잘 보여 주는 대체 방법인 기능 생성도 지원합니다. 이 방법은 XElement 및 XAttribute 생성자를 사용하여 수행할 수 있습니다. 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
합니다.
XML 문서가 XML 트리의 논리 컨테이너로 사용되는 W3C DOM과 비교합니다. 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
개념은 IEnumerable<T>의 XNode 또는 IEnumerable<T>의 XElement로 형식화된 쿼리의 결과에 의해 처리될 수 있습니다.
XPathNavigator 지원
LINQ to XML은 XPathNavigator 네임스페이스의 확장 메서드를 통해 System.Xml.XPath을 지원합니다. 자세한 내용은 System.Xml.XPath.Extensions를 참조하세요.
공백 및 들여쓰기 지원
LINQ to XML은 DOM보다 더 간단하게 공백을 처리합니다.
일반적인 시나리오는 들여쓰기된 XML을 읽고, 공백 텍스트 노드 없이 메모리 내 XML 트리를 만들고(즉, 공백을 유지하지 않음) XML에서 일부 작업을 수행하고, 들여쓰기를 사용하여 XML을 저장하는 것입니다. 서식을 사용하여 XML을 직렬화하면 XML 트리의 중요한 공백만 유지됩니다. LINQ to XML의 기본 동작입니다.
또 다른 일반적인 시나리오는 이미 의도적으로 들여쓰기된 XML을 읽고 수정하는 것입니다. 어떤 방식으로든 이 들여쓰기를 변경하지 않을 수 있습니다. LINQ to XML에서는 다음을 통해 이 작업을 수행할 수 있습니다.
- XML을 로드하거나 구문 분석할 때 공백 유지
- XML을 serialize할 때 서식을 사용하지 않도록 설정
LINQ to XML은 공백을 XText 노드로 저장하며, 이는 DOM과 달리 특수한 Whitespace 노드 형식을 사용하지 않습니다.
주석 지원
LINQ to XML 요소는 확장 가능한 주석 집합을 지원합니다. 스키마 정보, 요소가 UI에 바인딩되는지 여부에 대한 정보 또는 다른 종류의 애플리케이션 관련 정보와 같은 요소에 대한 기타 정보를 추적하는 데 유용합니다. 자세한 내용은 LINQ to XML 주석을 참조하세요.
스키마 정보 지원
LINQ to XML은 네임스페이스의 확장 메서드 System.Xml.Schema 를 통해 XSD 유효성 검사를 지원합니다. XML 트리가 XSD를 준수하는지 확인할 수 있습니다. XML 트리를 PSVI(사후 스키마 유효성 검사 정보 세트)로 채울 수 있습니다. 자세한 내용은 XSD 및 Extensions 참조하세요.
참고하십시오
.NET