如何从 XDocument 获取 XML 节点

Posted

技术标签:

【中文标题】如何从 XDocument 获取 XML 节点【英文标题】:How to Get XML Node from XDocument 【发布时间】:2009-04-15 15:34:13 【问题描述】:

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

这怎么可能????

提前致谢…………

【问题讨论】:

【参考方案1】:

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

【讨论】:

链接已失效。【参考方案2】:

.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,如果没有)。

马克

【讨论】:

您的编辑说明了这一点。他陷入了试图将查询用作结果集的经典错误。 ***.com/questions/594919/a-question-about-linq-to-sql/…我对类似问题的回答 您好,感谢您的回复。但是我仍然收到错误.......通过这个查询,我怎样才能在XDocument中添加新节点,更新和删除节点???? 如果你想添加新元素,你需要抓住你想添加东西的XElement。你想让我做什么?您无法通过一个查询完成所有操作...

以上是关于如何从 XDocument 获取 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XDocument 获取 Xml 作为字符串?

如何将 Xml 属性绑定到 Treeview 节点,同时将 XDocument 数据绑定到 WPF Treeview

如何从 XML 文件中过滤元素

WPF 关于XDocument(xml) 的部分操作记录

在 XDocument 中搜索 XML 节点时避免 Try n Catch

XDocument 读取具有名称空间的根元素的 XML 文件