XDocument 또는 XmlDocument


502

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


13
Microsoft의 문서 작성자가 차이점을 명확하게하기 위해 MSDN에 메모를하거나 언급하지 않은 이유가 무엇인지 궁금합니다.
Kamran Bigdely

1
MSDN의 일부 정보 : msdn.microsoft.com/en-us/library/... . 그리고 성능 질문 : stackoverflow.com/questions/4383919/… . 개인적으로 LINQ to XML을 사용하는 것이 더 쉽다는 것을 알았습니다.
nawfal

답변:


500

당신이 .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을 사용할 수 있습니다 .이 기술에 대한 다양한 블로그 게시물이 있습니다. 빠른 검색으로 찾은 것이 있습니다.


왜 다른지 말해 주실 수 있습니까? XDocument가 꽤 깔끔해 보이지만 DOM 수준의 차이는 모두 XML이 아니며 Microsoft X-DOM과 W3C Compliant DOM을 모두 보여주는 스키마가 있습니까? 감사.
Tarik

3
"체계"는 무엇을 의미합니까? "쇼"는 무엇을 의미합니까? 예, 둘 다 표준 XML을 다루지 만 LINQ to XML은 대부분의 경우 더 좋은 API입니다. 기술의 많은 뒤에 LINQ는 XML에 단순히 .NET 3.5 전에 사용할 수 없습니다.
Jon Skeet

문서 객체 모델이 다른지 여부를 의미합니까?
Tarik

6
글쎄, 그것들은 XML 자체를위한 API이기 때문에 다르지 않습니다. 나는 둘 다 약간의 한계 (그리고 내가 알고 있지만 내 머리 꼭대기에서 기억할 수없는 LINQ to XML이 있음)가 있다고 생각하지만 대부분의 경우 약간 다른 표현으로 동일한 모델로 취급 할 수 있습니다.
Jon Skeet

1
@SensorSmith : 시퀀스의 자동 병합, DateTime 처리 등과 같은 다른 모든 보너스를 다루지는 않습니다. 확장 기능을 추가 할 수도 있지만 LINQ to XML을 대신 사용할 수있는 이유는 무엇입니까?
존 소총

57

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

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


1
그리고 나는 당신의 진술이 반대로 사실이라는 것을 아무도 눈치 채지 못했습니다. XmlDocument는 행 정보를 제공하지만 XDocument는 제공하지 않습니다.
VVS

4
@ VVS : 오타가 끔찍한 순간 걱정 스러웠지만 다시 확인한 후에 XDocument는 회선 정보를 제공 한다는 것을 확인했습니다 . 두 번째 인수로 XDocument.Load 를 참조하십시오 LoadOptions.SetLineInfo. 라인 정보를 얻는 방법을 알고 있다면 XmlDocument궁금합니다. 이 답변을 썼을 때 찾을 수 없었습니다. 이 다른 대답은 확인에 보인다 stackoverflow.com/a/33622102/253883
줄리앙 Guertault에게

1
"그리고 XmlDocument를 사용하여 행복하게 구현하기 전에이 사실을 더 잘 알고 나중에 나중에 모든 것을 바꿔야한다는 것을 알게되었습니다." 내가 방금 한 일을 추측 :)
Paul

36

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

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

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


3
"직관적 인 VB.net에서 작업하기가 더 쉬울 것"이라고 생각했습니다. VB는 C #에 여전히 코드가 필요한 요소의 직접 작성을 지원하므로
Brain2000

24

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

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


23

다른 곳에서 언급했듯이, 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)");

14

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


-8

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

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


11
나는 당신이 틀렸다고 생각하기 때문에 다음에 수치로 의견을 뒷받침해야한다고 생각합니다. blogs.msdn.com/b/codejunkie/archive/2008/10/08/…
mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.