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ではありません。MicrosoftX-DOMとW3C準拠のDOMの両方を示すスキームはありますか?ありがとう。
Tarik

3
「スキーム」とは何を意味し、「ショー」とはどういう意味ですか?はい、どちらも標準のXMLを処理しますが、LINQ to XMLはほとんどの場合に適したAPIです。LINQ to XMLの背後にある多くのテクノロジは、.NET 3.5より前には利用できませんでした。
Jon Skeet、

それらのドキュメントオブジェクトモデルが異なるかどうかを意味しますか?
Tarik

6
どちらもXML自体のAPIなので、その意味では違いはありません。両方にいくつかの制限があると思います(そして、私が知っているLINQ to XMLの1つは知っていますが、頭から覚えていません)が、ほとんどの場合、わずかに異なる表現を持つ同じモデルとして扱うことができます。
Jon Skeet、

1
@SensorSmith:ただし、シーケンスの自動フラット化、DateTimeの処理など、他のすべてのボーナスはカバーしていません。これらすべての拡張メソッドを追加することもできますが、代わりに使用できるのにLINQ to XMLを再発明するのはなぜですか?
Jon Skeet

57

私は、答えのいずれも、これまでの事実に言及しない驚いていますXmlDocument何のライン情報を提供していないしながら、XDocumentありません(を通じてIXmlLineInfoインターフェース)。

これは場合によっては重要な機能になる可能性があり(たとえば、XMLでエラーを報告したり、要素が一般的に定義されている場所を追跡したりする場合)、XmlDocument後で使用するためにを使用して喜んで実装を開始する前に、このことをよく知っておく必要があります。あなたはそれをすべて変更する必要があることを発見してください。


1
そして、あなたの発言が逆に真実であることに誰も気付いていないことに驚いています。XmlDocumentは行情報を提供しますが、XDocumentは提供しません。
VVS

4
@VVS:私がひどいタイプミスをしたことを一瞬心配にさせてくれましたが、再確認した後、XDocument行情報が提供されていることを確認しました。2番目の引数としてXDocument.Loadを参照してくださいLoadOptions.SetLineInfo。行情報を取得する方法を知っているなら、XmlDocument私は興味があります。私がこの答えを書いたとき、私は何も見つけることができませんでした。この別の答えは確認するようです:stackoverflow.com/a/33622102/253883
Julien Guertault 2017

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。両方に不慣れな方は、この 2つを比較しているこのページをチェックして、どちらがより見栄えが良いかを選択してください。

私はLINQ to XMLを使い始めたばかりで、関数構成を使用してXMLドキュメントを作成する方法が気に入っています。本当に良い。比較すると、DOMは不格好です。


23

他の場所で述べたように、間違いなく、XMLにLINQの作成とXML文書と比較して風の変更を行いXmlDocument、そしてXNamespace ns + "elementName"名前空間を扱うときの構文は楽しい読書のためになります。

言及する価値がxslありxpath、注意するのが難しいことの1つは、以下を含めることで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)");

14

また、XDocumentXbox 360およびWindows Phone OS 7.0でもサポートされていることに注意してください。それらをターゲットにする場合は、のために開発するXDocumentか、から移行してくださいXmlDocument


-8

私はそれXDocumentがより多くのオブジェクト作成呼び出しを作ると信じています。多くのXMLドキュメントを処理している場合は、XMLDocumentより高速になると思います。

これが発生する1つの場所は、スキャンデータの管理です。多くのスキャンツールは、データをXMLで出力します(理由は明らかです)。これらのスキャンファイルを大量に処理する必要がある場合は、を使用するとパフォーマンスが向上すると思いますXMLDocument


11
私はあなたが間違っているかもしれないと思うので、あなたは次回数字であなたのコメントをバックアップするべきだと思います。blogs.msdn.com/b/codejunkie/archive/2008/10/08/…を
mike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.