私は今学習して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
行情報が提供されていることを確認しました。2番目の引数として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
例とは異なります)。
他の場所で述べたように、間違いなく、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)");
私はそれXDocument
がより多くのオブジェクト作成呼び出しを作ると信じています。多くのXMLドキュメントを処理している場合は、XMLDocument
より高速になると思います。
これが発生する1つの場所は、スキャンデータの管理です。多くのスキャンツールは、データをXMLで出力します(理由は明らかです)。これらのスキャンファイルを大量に処理する必要がある場合は、を使用するとパフォーマンスが向上すると思いますXMLDocument
。