【问题标题】:How to delete selected node from XML in C#?如何在 C# 中从 XML 中删除选定的节点?
【发布时间】: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

标签: c# xml visual-studio-2010 xmlnode


【解决方案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】:

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

      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 那些节点也请我该怎么办?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多