私は今学んでいます XmlDocument
しかしたった今 XDocument
そしてそれらの違いや利点を探そうとしたとき、私は何も役に立たないと思っていますが、なぜ他のものを使うのか教えてください。
.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
は遅延出力をサポートします)。 XmlReader
とXmlWriter
は.NETでXMLをストリーミングする通常の方法ですが、ある程度まですべてのAPIを混在させることができます。たとえば、大規模なドキュメントをストリーミングすることはできますが、XmlReader
を要素の先頭に配置し、そこからXElement
を読み込んで処理してから、次の要素に進むなどしてLINQ to XMLを使用できます。テクニック、 こちらがクイック検索で見つけたものです 。
XmlDocument
が行情報を提供しないのに対し、XDocument
がを介して提供するという事実に言及している答えがどれも驚くことではありません。 IXmlLineInfo
interface).
これは、場合によっては重要な機能になることがあります(たとえば、XMLでエラーを報告したり、要素がどこで定義されているかを追跡したい場合など)。XmlDocument
を使用して実装を開始する前に後でそれをすべて変えなければならないことを発見しなさい。
XmlDocument
は、XML DOMオブジェクトモデルに精通している開発者に最適です。それはしばらく前から出回っていて、多かれ少なかれW3C規格に対応しています。手動ナビゲーションとXPath
ノード選択をサポートします。
XDocument
は、.NET 3.5のLINQ to XML機能を強化します。それはIEnumerable<>
を多用し、まっすぐなC#で作業するのをより簡単にすることができます。
どちらのドキュメントモデルでも、ドキュメント全体をメモリにロードする必要があります(たとえばXmlReader
とは異なります)。
XDocument
はLINQ to XML APIのもので、XmlDocument
はXMLの標準DOMスタイルAPIです。 DOMをよく知っていて、LINQ to XMLを学びたくない場合はXmlDocument
を使ってください。あなたが両方に不慣れなら、 この2つを比較するページ をチェックして、どちらがあなたがより良く見えるかを選んでください。
私はLINQ to XMLを使い始めたばかりで、機能的な構成を使ってXML文書を作成する方法が大好きです。本当に良い。 DOMはそれと比較して不格好です。
他の場所で述べたように、間違いなく、Linq to Xmlはxmlドキュメントの作成と変更をXmlDocument
と比較して簡単にし、XNamespace ns + "elementName"
構文は名前空間を扱うときに読みやすいものにします。
xsl
とxpath
について言及する価値のあることの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)");
また、XDocument
はXbox 360とWindows Phone OS 7.0でサポートされています。ターゲットにする場合は、XDocument
用に開発するか、XmlDocument
から移行してください。
上記のW0landsのコメントに加えて、Windows 8用のUnity3Dプロジェクトをビルドするときにも同じことが当てはまります。このシナリオでもXDocumentを使用する必要があります。