XML元素删除,只需要删除一个元素而不是父元素

本文关键字:元素 删除 一个 XML | 更新日期: 2023-09-27 18:27:01

基本上,我要做的是从列表中删除一个VSLOC。我不想删除所有属于它的东西。

<?xml version="1.0"?>
<GarageNumbers>
  <G554>
    <id>G554</id>
    <VSLOC>V002</VSLOC>
    <VSLOC>V003</VSLOC>
    <VSLOC>V002</VSLOC>
  </G554>
  <G566>
    <id>G566</id>
    <VSLOC>V002</VSLOC>
    <VSLOC>V003</VSLOC>
    <VSLOC>V002</VSLOC>
  </G566>
  <G572>
    <id>G572</id>
    <VSLOC>V001</VSLOC>
    <VSLOC>V002</VSLOC>
  </G572>
</GarageNumbers>

所以,我设置的是一个组合框,我从中选择一个G#,在列表框中显示与它相关的所有VSLOC。我需要做的是从列表框中选择一个项目,并使用按钮从列表框和xml文档中删除该行。我有所有这些设置,但当我按下按钮时,它会删除G554和所有带有的元素。

因此,如果我想从G554中的列表中选择V002,我希望它只删除带有内文的VSLOC。

XmlDocument xDoc = new XmlDocument();
            xDoc.Load(Application.StartupPath + "/xmlData.xml");
            foreach (XmlNode xNode in xDoc.SelectNodes("GarageNumbers/G554"))
                if (xNode.SelectSingleNode("VSLOC").InnerText == "V002")
                    xNode.ParentNode.RemoveChild(xNode);
            xDoc.Save(Application.StartupPath + "/xmlData.xml");

XML元素删除,只需要删除一个元素而不是父元素

您应该能够深入到所需的元素,然后删除它们。例如,假设您的XML位于XElement中,则这种方法会起作用:

string targetCategory = "G554";
string vsloc = "V002";
xml.Element(targetCategory)
   .Elements("VSLOC")
   .Where(e => e.Value == vsloc)
   .Remove();

如果使用的是XDocument,则添加Root属性:xml.Root

var xDoc = XDocument.Load(fname);
var node = xDoc.Descendants("VSLOC")
                .Where(e => (string)e.Parent.Element("id") == "G554")
                .FirstOrDefault();
if (node != null) node.Remove();
xDoc.Save(fname);