1. ホーム
  2. c#

[解決済み] XDocument または XmlDocument

2022-02-24 06:46:44

質問

私は今、以下のことを学んでいます。 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")));

LINQ to XMLでは、私がこれまで見てきた他のXML APIとは異なり、名前空間がかなり簡単に扱えるようになっています。

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のスタイルに合致するものです。

さて、ブラノンが言ったように、これらはストリーミングではなくインメモリAPIです(ただし XStreamingElement は遅延出力に対応しています)。 XmlReaderXmlWriter は、.NETでXMLをストリーミングする通常の方法ですが、すべてのAPIをある程度混在させることができます。たとえば、大きなドキュメントをストリーミングしながら、LINQ to XMLを使用するために XmlReader を要素の先頭で読み出し、その後に XElement を処理し、次の要素に移るなど。この手法については、様々なブログ記事があります。 検索して見つけたのはこちらです。 .