如何从XDocument获取XML节点

35

如何使用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文件中获取特定的节点?我想要更新该节点中的一些值。

这可以怎么做?

2个回答

72

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

链接已失效。 - Tim Friesen

12
.Elements操作返回XElements列表,但你真正想要的是单个元素。添加这个:
XElement Contacts = (from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
                    where xml2.Element("ID").Value == variable
                    select xml2).FirstOrDefault();
这种方式可以让LINQ从选择的XElement列表中返回第一个(如果存在),否则返回NULL。
Marc

2
你的编辑让问题更加明确了。他正在陷入一个经典错误,试图将查询作为结果集使用。http://stackoverflow.com/questions/594919/a-question-about-linq-to-sql/594975#594975 我对类似问题的回答。 - Benjamin Autin
嗨,感谢您的回复。但我仍然遇到了错误.......通过这个查询,我怎样才能在XDocument中添加新节点、更新和删除节点呢? - Shine S
1
如果您想添加新元素,您需要获取要添加内容的XElement。您想做什么?您不能通过一个单一的查询完成所有操作... - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接