web-dev-qa-db-ja.com

XDocumentからXML Nodeを取得する方法

LINQを使用してXDocumentからXML要素を取得する方法は?

以下に示すXMLDocという名前のXDocumentがあるとします。

<Contacts>
       <Node>
           <ID>123</ID>
           <Name>ABC</Name>
       </Node>
       <Node>
           <ID>124</ID>
           <Name>DEF</Name>
       </Node>
</Contacts>

XElement Contacts = from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
                    where xml2.Element("ID").Value == variable
                    select xml2;

しかし、「オブジェクト参照を設定しないでください...」というエラーが表示されます。

LINQを使用してXMLファイルから特定のNodeを取得する方法?そして、そのノードのいくつかの値を更新したいですか?

どのように可能ですか????

前もって感謝します.........

34
Shine S

追加の質問 への回答はOPによって投稿されました。

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<Contacts>
  <Node>
    <ID>123</ID>
    <Name>ABC</Name>
  </Node>
  <Node>
    <ID>124</ID>
    <Name>DEF</Name>
  </Node>
</Contacts>

単一のノードを選択:

XDocument XMLDoc = XDocument.Load("test.xml");
string id = "123"; // id to be selected

XElement Contact = (from xml2 in XMLDoc.Descendants("Node")
                    where xml2.Element("ID").Value == id
                    select xml2).FirstOrDefault();

Console.WriteLine(Contact.ToString());

単一ノードの削除:

XDocument XMLDoc = XDocument.Load("test.xml");
string id = "123";

var Contact = (from xml2 in XMLDoc.Descendants("Node")
               where xml2.Element("ID").Value == id
               select xml2).FirstOrDefault();

Contact.Remove();
XMLDoc.Save("test.xml");

新しいノードを追加:

XDocument XMLDoc = XDocument.Load("test.xml");

XElement newNode = new XElement("Node",
    new XElement("ID", "500"),
    new XElement("Name", "Whatever")
);

XMLDoc.Element("Contacts").Add(newNode);
XMLDoc.Save("test.xml");
69
Ondrej Slinták

.Elements操作はXElementsのリストを返しますが、本当に必要なのはSINGLE要素です。これを追加:

XElement Contacts = (from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
                    where xml2.Element("ID").Value == variable
                    select xml2).FirstOrDefault();

この方法で、LINQに、選択しているXElementのリストから最初(または、存在しない場合はNULL)を提供するように指示します。

マーク

11
marc_s