나는 지금 배우고 XmlDocument
있지만 방금 뛰어 들었고 XDocument
그 차이점이나 이점을 검색하려고 할 때 유용한 것을 찾을 수 없습니다. 왜 다른 것을 사용하는지 말해 줄 수 있습니까?
나는 지금 배우고 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
게으른 출력을 지원 하지만 ). XmlReader
및 XmlWriter
.NET에서 XML 스트리밍의 정상적인 방법이 있습니다,하지만 당신은 어느 정도 모든 API를 혼합 할 수 있습니다. 예를 들어, 큰 문서를 스트리밍 할 수 있지만 XmlReader
요소의 시작 부분 에 위치 를 지정하고 요소를 읽고 XElement
처리 한 후 다음 요소로 이동 하여 LINQ to XML을 사용할 수 있습니다 .이 기술에 대한 다양한 블로그 게시물이 있습니다. 빠른 검색으로 찾은 것이 있습니다.
나는 대답 놀랄 것도 지금까지 사실을 언급하지 오전 XmlDocument
에는 줄 정보를 제공하지 않습니다를 하면서, XDocument
하지 (관통 IXmlLineInfo
인터페이스).
이것은 (당신이 보고서의 오류를 원하는 경우 XML 예를 들어, 또는 요소가 일반적으로 정의되는 위치 추적) 어떤 경우에는 중요한 기능이 될 당신이 행복하게 사용하여 구현하려면 시작하기 전에 당신은 더 나은이 인식 할 수 있습니다 XmlDocument
나중에, 당신이 모두 변경해야 발견 할 수 있습니다.
XDocument
는 회선 정보를 제공 한다는 것을 확인했습니다 . 두 번째 인수로 XDocument.Load 를 참조하십시오 LoadOptions.SetLineInfo
. 라인 정보를 얻는 방법을 알고 있다면 XmlDocument
궁금합니다. 이 답변을 썼을 때 찾을 수 없었습니다. 이 다른 대답은 확인에 보인다 stackoverflow.com/a/33622102/253883
XmlDocument
XML DOM 객체 모델에 익숙한 개발자에게 좋습니다. 오래 전부터 사용되었으며 W3C 표준에 해당합니다. 수동 탐색 및 XPath
노드 선택을 지원합니다 .
XDocument
.NET 3.5의 LINQ to XML 기능을 강화합니다. IEnumerable<>
C # 을 많이 사용 하고 작업하기가 더 쉽습니다.
두 문서 모델 모두 XmlReader
예를 들어 , 전체 문서를 메모리에로드해야합니다 .
다른 곳에서 언급했듯이, Linq to Xml은 XML 문서를 작성 및 변경하는 것과 비교할 때 바람이 불고 XmlDocument
, XNamespace ns + "elementName"
구문은 네임 스페이스를 다룰 때 즐거운 독서를 만듭니다.
언급 xsl
하고 언급하기 xpath
어려운 점 중 하나 는 xpath 1.0
Linq 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)");
나는 그것이 XDocument
훨씬 더 많은 객체 생성 호출을 한다고 믿습니다 . 많은 XML 문서를 처리 할 때 XMLDocument
더 빠를 것이라고 생각합니다.
이런 일이 발생하는 곳은 스캔 데이터를 관리하는 것입니다. 많은 스캔 도구가 명백한 이유로 데이터를 XML로 출력합니다. 이러한 스캔 파일을 많이 처리해야한다면 성능이 향상 될 것입니다 XMLDocument
.