web-dev-qa-db-ja.com

XDocumentまたはXmlDocument

私は今学んでいます XmlDocument しかしたった今 XDocument そしてそれらの違いや利点を探そうとしたとき、私は何も役に立たないと思っていますが、なぜ他のものを使うのか教えてください。

478
Tarik

.NETバージョン3.0以下を使用している場合は、haveを使用して、古典的なDOM APIとも呼ばれるXmlDocumentを使用します。同様に、これを期待する他のAPIがいくつかあります。

あなたが選択を得た場合は、しかし、私は徹底的にXDocument別名LINQ to XMLを使用することをお勧めします。それはmuch文書を作成して処理する方が簡単です。たとえば、それは次のような違いです。

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を使用できます。テクニック、 こちらがクイック検索で見つけたものです

474
Jon Skeet

XmlDocumentが行情報を提供しないのに対し、XDocumentを介して提供するという事実に言及している答えがどれも驚くことではありません。 IXmlLineInfo interface).

これは、場合によっては重要な機能になることがあります(たとえば、XMLでエラーを報告したり、要素がどこで定義されているかを追跡したい場合など)。XmlDocumentを使用して実装を開始する前に後でそれをすべて変えなければならないことを発見しなさい。

53

XmlDocumentは、XML DOMオブジェクトモデルに精通している開発者に最適です。それはしばらく前から出回っていて、多かれ少なかれW3C規格に対応しています。手動ナビゲーションとXPathノード選択をサポートします。

XDocumentは、.NET 3.5のLINQ to XML機能を強化します。それはIEnumerable<>を多用し、まっすぐなC#で作業するのをより簡単にすることができます。

どちらのドキュメントモデルでも、ドキュメント全体をメモリにロードする必要があります(たとえばXmlReaderとは異なります)。

34
Brannon

XDocumentはLINQ to XML APIのもので、XmlDocumentはXMLの標準DOMスタイルAPIです。 DOMをよく知っていて、LINQ to XMLを学びたくない場合はXmlDocumentを使ってください。あなたが両方に不慣れなら、 この2つを比較するページ をチェックして、どちらがあなたがより良く見えるかを選んでください。

私はLINQ to XMLを使い始めたばかりで、機能的な構成を使ってXML文書を作成する方法が大好きです。本当に良い。 DOMはそれと比較して不格好です。

23
Daniel Chambers

他の場所で述べたように、間違いなく、Linq to Xmlはxmlドキュメントの作成と変更をXmlDocumentと比較して簡単にし、XNamespace ns + "elementName"構文は名前空間を扱うときに読みやすいものにします。

xslxpathについて言及する価値のあることの1つは、Linq 2 Xml XNodesで任意のxpath 1.0式を実行できることですIS含めることにより:

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)");
22
StuartLC

また、XDocumentはXbox 360とWindows Phone OS 7.0でサポートされています。ターゲットにする場合は、XDocument用に開発するか、XmlDocumentから移行してください。

14
w0land

上記のW0landsのコメントに加えて、Windows 8用のUnity3Dプロジェクトをビルドするときにも同じことが当てはまります。このシナリオでもXDocumentを使用する必要があります。

3
Buzzrick