Как получить XML-узел из XDocument - PullRequest
33 голосов
/ 15 апреля 2009

Как получить элемент XML из XDocument с помощью LINQ?

Предположим, у меня есть XDocument Named XMLDoc, который показан ниже:

<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;

Но я получаю сообщение об ошибке "Ссылка на объект НЕ устанавливается ....."

Как получить конкретный узел из файла XML с помощью LINQ? И я хочу обновить некоторые значения в этом узле?

Как это возможно ????

Заранее спасибо .........

Ответы [ 2 ]

68 голосов
/ 28 мая 2010

Ответ на дополнительный вопрос от ОП.

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");
11 голосов
/ 15 апреля 2009

Операция .Elements возвращает СПИСОК XElements, но то, что вы действительно хотите, - это ОДИН элемент. Добавьте это:

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

Таким образом, вы говорите LINQ предоставить вам первый (или NULL, если их там нет) из того списка L элементов XE, который вы выбираете.

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...