私は今学んXmlDocument
でいXDocument
ますが、それらの違いや利点を検索しようとすると、役立つものが見つかりません。
7 に答える
.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
後で使用して実装を開始する前に、これをよく知っておく必要があります。すべてを変更する必要があることを発見してください。
XmlDocument
XML DOM オブジェクト モデルに精通している開発者に最適です。しばらく前から存在しており、多かれ少なかれ W3C 標準に対応しています。XPath
手動ナビゲーションとノード選択をサポートしています。
XDocument
.NET 3.5 の LINQ to XML 機能を強化します。これは頻繁に使用さIEnumerable<>
れ、ストレート C# での作業がより簡単になります。
どちらのドキュメント モデルでも、ドキュメント全体をメモリに読み込む必要があります (XmlReader
例とは異なります)。
他の場所で述べたように、間違いなく、Linq to Xml は と比較して xml ドキュメントの作成と変更を簡単にしXmlDocument
、XNamespace ns + "elementName"
構文は名前空間を扱うときに楽しく読むことができます。
言及する価値があり、注意するのが難しいことの1つxsl
はxpath
、以下を含めることにより、xpath 1.0
Linq 2 Xmlで任意の式を実行できることです。XNodes
using System.Xml.XPath;
xpath
次に、これらの拡張メソッドを使用してデータをナビゲートおよび投影できます。
- XPathSelectElement - 単一要素
- XPathSelectElements - ノード セット
- XPathEvaluate - スカラーなど
たとえば、次の 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
LINQ to XML API からのものであり、XmlDocument
XML 用の標準 DOM スタイル API です。DOM をよく知っていて、LINQ to XML を学びたくない場合は、XmlDocument
. 両方に慣れていない場合は、この 2 つを比較するこのページをチェックして、見た目が良い方を選んでください。
私は LINQ to XML を使い始めたばかりで、関数構造を使用して XML ドキュメントを作成する方法が気に入っています。本当に良い。それに比べて、DOM は扱いにくいです。
XDocument
また、 Xbox 360 および Windows Phone OS 7.0 でサポートされていることに注意してください。それらをターゲットにする場合は、 用に開発するXDocument
か、から移行してXmlDocument
ください。
私はそれXDocument
がより多くのオブジェクト作成呼び出しを行うと信じています。大量の XML ドキュメントを処理している場合は、XMLDocument
より高速になると思います。
これが発生する場所の 1 つは、スキャン データの管理です。多くのスキャン ツールは、データを XML で出力します (理由は明らかです)。これらのスキャン ファイルを大量に処理する必要がある場合は、XMLDocument
.