【问题标题】:How to Get XML Node from XDocument如何从 XDocument 获取 XML 节点
【发布时间】: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 文件中获取特定节点? 我想更新该节点中的一些值?

这怎么可能????

提前致谢…………

【问题讨论】:

    标签: c# .net linq linq-to-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,如果没有)。

    马克

    【讨论】:

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