删除XML节点-Xelement

4

我有一个XML文件,只需删除特定的节点。节点名称将根据用户输入提供。如何删除用户请求的特定节点?

<Customers>    
  <Customer>    
    <id>michle</id>
    <address>newjersy</address>    
  </Customer>    
  <Customer>    
    <id>ann</id>
    <address>canada</address>    
  </Customer>
</Customers>

我已经尝试了

var customer = new XElement("customer",
      from o in customers
      select 
          new XElement("id", id),
          new XElement("address", address)
        );

客户端将包含一个新的节点。
<Customer>    
  <id>ann</id>
  <address>canada</address>    
</Customer>

doc.Element("customers").Elements(customer).ToList().Remove();

但是这并没有起作用。我该如何从xml中删除元素?

注:此代码为C#语言中使用的方法,目的是从XML文档中删除名称为“customer”的子元素。

不行,我在编译时出现了错误。似乎不允许使用Customer作为变量。 - Tom Cruise
3个回答

2

汤姆,

试一下这个...

private static void RemoveNode(string sID)
    {
        XDocument doc = XDocument.Load(@"D:\\Projects\\RemoveNode.xml");

        var v = from n in doc.Descendants("Customer")
                     where n.Element("id").Value == sID
                     select n;
        v.Remove();
        doc.Save(@"D:\\Projects\\RemoveNode.xml");
    }

当我使用它调用时,它会移除一个节点。
RemoveNode("michle");

希望这能有所帮助。

1
您的主要错误是创建新节点而不是从源文档中检索现有节点。
您可以使用MSDN上的文章"从XML树中删除元素、属性和节点"作为操作XML数据的指南。
例如,使用XNode.Remove()方法从树中删除一个节点,或者使用Extensions.Remove<T>(this IEnumerable<T> source) where T : XNode从源节点集合中删除每个节点:
doc.Descendants("Customer")
    .Where(x => x.Element("id").Value == id)
    .Remove();

但是在此之后,您还需要通过Save方法保存文档以提交更改:

doc.Save();

出现错误:Error 'System.Xml.Linq.XElement' does not contain a definition for 'RemoveChild',并且找不到接受类型为'System.Xml.Linq.XElement'的第一个参数的扩展方法'RemoveChild' (是否缺少using指令或程序集引用?)。 - Tom Cruise
当我尝试使用customer.remove()时,错误返回parent is missing。 - Tom Cruise
@TomCruise 是的,因为你正在创建新节点而不是从xml中检索它。有关详细信息,请参见最后一个链接。 - Vadim Martynov
@TomCruise 我已经更新了我的答案,并添加了新的细节和参考资料。 - Vadim Martynov

0

您可以根据id删除此方式。

        xdoc.Descendants("Customer")
        .Where(x => (string)x.Element("id") == "michle")
        .Remove();

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