如何在 C# 中从 XML 中删除选定的节点?

Posted

技术标签:

【中文标题】如何在 C# 中从 XML 中删除选定的节点?【英文标题】:How to delete selected node from XML in C#? 【发布时间】:2012-10-08 12:31:15 【问题描述】:

我是 C# 新手我有问题... 我想从我的XMl 文件中删除selected node 在这里,我只是尝试使用此代码,但没有得到任何人的帮助

private void btnDelete_Click(object sender, EventArgs e)

    xdoc.Load(strFilename);
    string Xpath = string.Format("root/0/1",_strProCat,_strProdType);
    xdoc.SelectSingleNode(Xpath).RemoveAll();

    xdoc.Save(strFilename);
    MessageBox.Show("Deleted Successfully");

这是我的 Xml 文件

<root>
  <product category="Soaps">
   <product type="Washing">
     <product name="Rin">
      <Id>100</Id>
      <AvailProducts>30</AvailProducts>
      <Cost>20.00</Cost>
   </product>
  <product name="Tide">
    <Id>101</Id>
    <AvailProducts>30</AvailProducts>
    <Cost>15.00</Cost>
  </product>
 </product>
</product>
</root>

我只想删除 Node 哪个产品name="Tide"

【问题讨论】:

xdoc是哪个类型,_strProCat_strProdType的值是什么? 您能告诉我如何在 XML 文件中添加 ID 吗?使用新记录自动 +1 【参考方案1】:

您可以简单地使用以下代码:

private void btnDelete_Click(object sender, EventArgs e)

    var xDoc = XDocument.Load(strFilename);

    foreach (var elem in xDoc.Document.Descendants("product"))
    
        foreach (var attr in elem.Attributes("name"))
        
            if (attr.Value.Equals("Tide"))
                elem.RemoveAll();
        
    

    xDoc.Save(destinationFilename);
    MessageBox.Show("Deleted Successfully");

快乐编码...

【讨论】:

【参考方案2】:

应该这样做:

xdoc.Elements("product").Where(x=> x.Element("name").Value == "Tide").FirstOrDefault().Remove();

【讨论】:

【参考方案3】:

如果你想要XPathXmlDocument,那么下面就是这样做的方法..

XmlDocument xdoc = new XmlDocument();
xdoc.Load(strFilename);
string Xpath = string.Format("root/product[@category='0']/product[@type='1']/product[@name='2']", "Soaps", "Washing", "Tide");
xdoc.SelectSingleNode(Xpath).RemoveAll();
xdoc.Save(strFilename);

更新

根据您的要求To Remove the empty node,尝试以下代码将空节点删除为

XmlNodeList emptyElements = xdoc.SelectNodes(@"//*[not(node())]");
for (int i = emptyElements.Count - 1; i > -1; i--)

     XmlNode nodeToBeRemoved = emptyElements[i];
     nodeToBeRemoved.ParentNode.RemoveChild(nodeToBeRemoved);

现在你的最终完整代码将如下所示

string Xpath = string.Format("root/product[@category='0']/product[@type='1']/product[@name='2']", "Soaps", "Washing", "Tide");                      
xdoc.SelectSingleNode(Xpath).RemoveAll();
XmlNodeList emptyElements = xdoc.SelectNodes(@"//*[not(node())]");

for (int i = emptyElements.Count - 1; i > -1; i--)

      XmlNode nodeToBeRemoved = emptyElements[i];
      nodeToBeRemoved.ParentNode.RemoveChild(nodeToBeRemoved);

xdoc.Save(strFilename);

【讨论】:

它会正常工作但是在这段代码中我遇到了一个问题 1003020.00 删除后 这个属性仍然是我想要的是 Delete 那些节点也请我该怎么办?

以上是关于如何在 C# 中从 XML 中删除选定的节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中从Treeview的选定节点获取下一个直接节点?

如何使用 C# 从 XML 节点列表中删除节点

如何在 C# 中从包含 XML 的字符串中读取数据?

在 Powershell 中从非常大的 XML 文件中删除节点

如何在 C# 中从 DB (*.mdb) 中删除一行

如何在 C# 中从数据表生成 XML