565

私は今学んXmlDocumentでいXDocumentますが、それらの違いや利点を検索しようとすると、役立つものが見つかりません。

4

7 に答える 7

540

.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 を使用できます。この手法に関するさまざまなブログ投稿があります。ここに私がクイック検索で見つけたものがあります

于 2009-10-09T06:26:04.390 に答える
65

XmlDocumentこれまでのところ、回線情報を提供していないという事実に言及している回答はありませXDocumentんがIXmlLineInfo、(インターフェイスを介して)提供していることに驚いています。

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

于 2012-08-29T05:12:54.480 に答える
40

XmlDocumentXML DOM オブジェクト モデルに精通している開発者に最適です。しばらく前から存在しており、多かれ少なかれ W3C 標準に対応しています。XPath手動ナビゲーションとノード選択をサポートしています。

XDocument.NET 3.5 の LINQ to XML 機能を強化します。これは頻繁に使用さIEnumerable<>れ、ストレート C# での作業がより簡単になります。

どちらのドキュメント モデルでも、ドキュメント全体をメモリに読み込む必要があります (XmlReader例とは異なります)。

于 2009-10-09T06:26:48.267 に答える
27

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

言及する価値があり、注意するのが難しいことの1つxslxpath、以下を含めることにより、xpath 1.0Linq 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)");
于 2014-12-20T18:19:16.510 に答える
26

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

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

于 2009-10-09T06:26:27.707 に答える
14

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

于 2010-09-27T15:28:38.473 に答える
-8

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

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

于 2012-04-27T20:28:26.437 に答える