[C#] XDocument 또는 XmlDocument

나는 지금 배우고 XmlDocument있지만 방금 뛰어 들었고 XDocument그 차이점이나 이점을 검색하려고 할 때 유용한 것을 찾을 수 없습니다. 왜 다른 것을 사용하는지 말해 줄 수 있습니까?



답변

당신이 .NET 버전 3.0을 사용하거나 낮은 경우, 당신 사용하는 XmlDocument고전적인 DOM의 API 일명. 마찬가지로이를 기대할 수있는 다른 API가 있습니다.

그러나 선택을한다면 XDocument일명 LINQ to XML을 사용하는 것이 좋습니다 . 그것은의 많은 문서를 생성하고 처리하는 것이 더 간단. 예를 들어 다음과 같은 차이점이 있습니다.

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);

XDocument doc = new XDocument(
    new XElement("root",
                 new XAttribute("name", "value"),
                 new XElement("child", "text node")));

네임 스페이스는 내가 본 다른 XML API와 달리 LINQ to XML에서 작업하기가 매우 쉽습니다.

XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc

LINQ to XML은 LINQ 와도 잘 작동합니다. 구성 모델을 사용하면 하위 요소 시퀀스를 사용하여 요소를 실제로 쉽게 작성할 수 있습니다.

// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
    customers.Select(c => new XElement("customer",
        new XAttribute("name", c.Name),
        new XAttribute("lastSeen", c.LastOrder)
        new XElement("address",
            new XAttribute("town", c.Town),
            new XAttribute("firstline", c.Address1),
            // etc
    ));

일반적인 LINQ 스타일에 맞는 훨씬 더 선언적입니다.

Brannon이 언급했듯이, 이들은 스트리밍 API가 아닌 인 메모리 API입니다 ( XStreamingElement게으른 출력을 지원 하지만 ). XmlReaderXmlWriter.NET에서 XML 스트리밍의 정상적인 방법이 있습니다,하지만 당신은 어느 정도 모든 API를 혼합 할 수 있습니다. 예를 들어, 큰 문서를 스트리밍 할 수 있지만 XmlReader요소의 시작 부분 에 위치 를 지정하고 요소를 읽고 XElement처리 한 후 다음 요소로 이동 하여 LINQ to XML을 사용할 수 있습니다 .이 기술에 대한 다양한 블로그 게시물이 있습니다. 빠른 검색으로 찾은 것이 있습니다.


답변

나는 대답 놀랄 것도 지금까지 사실을 언급하지 오전 XmlDocument에는 줄 정보를 제공하지 않습니다를 하면서, XDocument하지 (관통 IXmlLineInfo인터페이스).

이것은 (당신이 보고서의 오류를 원하는 경우 XML 예를 들어, 또는 요소가 일반적으로 정의되는 위치 추적) 어떤 경우에는 중요한 기능이 될 당신이 행복하게 사용하여 구현하려면 시작하기 전에 당신은 더 나은이 인식 할 수 있습니다 XmlDocument나중에, 당신이 모두 변경해야 발견 할 수 있습니다.


답변

XmlDocumentXML DOM 객체 모델에 익숙한 개발자에게 좋습니다. 오래 전부터 사용되었으며 W3C 표준에 해당합니다. 수동 탐색 및 XPath노드 선택을 지원합니다 .

XDocument.NET 3.5의 LINQ to XML 기능을 강화합니다. IEnumerable<>C # 을 많이 사용 하고 작업하기가 더 쉽습니다.

두 문서 모델 모두 XmlReader예를 들어 , 전체 문서를 메모리에로드해야합니다 .


답변

XDocumentLINQ to XML API이며 XML 용 XmlDocument표준 DOM 스타일 API입니다. DOM을 잘 알고 있고 LINQ to XML을 배우고 싶지 않다면로 이동하십시오 XmlDocument. 둘 다 처음 사용하는 경우이페이지 를 비교 한이 페이지 를 확인하고 더 좋아 보이는 페이지 를 선택하십시오.

난 그냥 XML에 LINQ를 사용하기 시작했습니다, 그리고 당신이 기능적인 구조를 사용하여 XML 문서를 작성하는 방법을 좋아한다. 정말 좋습니다. DOM은 비교가 어렵다.


답변

다른 곳에서 언급했듯이, Linq to Xml은 XML 문서를 작성 및 변경하는 것과 비교할 때 바람이 불고 XmlDocument, XNamespace ns + "elementName"구문은 네임 스페이스를 다룰 때 즐거운 독서를 만듭니다.

언급 xsl하고 언급하기 xpath어려운 점 중 하나 는 xpath 1.0Linq 2 Xml에서 다음 XNodes을 포함하여 임의의 표현식 을 계속 실행할 수 있다는 것입니다 .

using System.Xml.XPath;

xpath다음 확장 방법 을 통해 데이터를 탐색하고 투영 할 수 있습니다 .

예를 들어 Xml 문서가 주어진 경우 :

<xml>
    <foo>
        <baz id="1">10</baz>
        <bar id="2" special="1">baa baa</bar>
        <baz id="3">20</baz>
        <bar id="4" />
        <bar id="5" />
    </foo>
    <foo id="123">Text 1<moo />Text 2
    </foo>
</xml>

우리는 평가할 수 있습니다 :

var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");


답변

또한 XDocumentXbox 360 및 Windows Phone OS 7.0에서도 지원됩니다. 목표로 삼으려면에서 개발 XDocument하거나 마이그레이션하십시오 XmlDocument.


답변

나는 그것이 XDocument훨씬 더 많은 객체 생성 호출을 한다고 믿습니다 . 많은 XML 문서를 처리 할 때 XMLDocument더 빠를 것이라고 생각합니다.

이런 일이 발생하는 곳은 스캔 데이터를 관리하는 것입니다. 많은 스캔 도구가 명백한 이유로 데이터를 XML로 출력합니다. 이러한 스캔 파일을 많이 처리해야한다면 성능이 향상 될 것입니다 XMLDocument.