【问题标题】:How to delete a node from a xml c#?如何从 xml c# 中删除节点?
【发布时间】:2012-12-13 10:43:12
【问题描述】:

我有一个这样的 xml 结构:-

<Person id="1" Name="Rahul lamba" Manager_Id="13" Department="IT" />
<Person id="6" Name="Saurabh" Manager_Id="4" Department="IT" />
<Person id="5" Name="Amitesh" Manager_Id="6" Department="IT" />

现在我想从每一行的 XML 中删除 Manager_Id 节点。

我试过了,但没有任何效果

XmlNodeList l = doc.GetElementsByTagName("Person");

 foreach (XmlNode item in l)
     {
         foreach (var  item1 in item.ChildNodes)
             {
                 if (item1 == "Manager_Id")
                     {
                        //Code to remove Manager_Id node.
                     }
             }
      }

我怎样才能做到这一点?

提前感谢。

【问题讨论】:

  • //Code to ... 上的代码你试过什么?
  • 我没有在这里尝试过任何东西,因为我没有先在 ChildNodes 得到任何东西。
  • 姓名、Manager_Id、部门不是节点。那就是属性

标签: c# asp.net xml c#-4.0 linq-to-xml


【解决方案1】:

您可以使用 Linq To Xml 轻松完成,

var xDoc = XDocument.Parse(xmlstring); //XDocument.Load(filename)

xDoc.Descendants("Person")
    .Select(x => x.Attribute("Manager_Id"))
    .Where(x => x!=null)
    .ToList().ForEach(a => a.Remove());

var newxml = xDoc.ToString(); //xDoc.Save(fileName);

【讨论】:

  • 在代码的第二行获取异常对象引用未设置为实例
  • @Rahul 您的 xml 正在发送一个 root 节点。所以我在测试上面的代码时添加了一个根节点。另外,您的所有 Person 节点是否都有 Manager_Id 属性?
  • @Rahul 如果有些人没有Manager_Id 属性,我添加了.Where(x =&gt; x!=null)
【解决方案2】:
XmlTextReader reader = new XmlTextReader(@"C:\MyXml.xml");
        reader.Read();
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNode node = doc.SelectSingleNode("/Persons/Person[@Manager_Id=6]");
        node.ParentNode.RemoveChild(node);
        reader.Close();
        doc.Save(@"D:\MyXml.xml"); 

使用 att 删除所有节点

XmlTextReader reader = new XmlTextReader(@"C:\MyXml.xml");
        reader.Read();
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNodeList lstNode = doc.SelectNodes("/Persons/Person[@Manager_Id]");
        foreach (XmlNode node in lstNode)
        {
            node.ParentNode.RemoveChild(node);
        }
        reader.Close();
        doc.Save(@"C:\MyXml.xml"); 

【讨论】: