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

时间:2013-08-08 21:21:03

标签: c# xml

基本上我要做的是从列表中删除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");

2 个答案:

答案 0 :(得分:2)

您应该能够深入查看所需的元素,然后将其删除。例如,假设您的XML位于XElement,这种方法可行:

string targetCategory = "G554";
string vsloc = "V002";

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

如果您使用的是XDocument,请添加Root媒体资源:xml.Root

答案 1 :(得分:1)

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);
相关问题