从XmlDocument中删除节点

时间:2015-01-29 18:07:22

标签: c# xpath

我有以下XML结构:

<?xml version="1.0" encoding="utf-8"?>
<Class>
  <subjects>
  </subjects>
  <students>
    <Name>klashf</Name>
    <Name>lkashf</Name>
  </students>
  <marks>
    <english>yes</english>
    <math>yes</math>
  </marks>
</Class>

现在,例如我想从中删除English元素<english>yes</english>。我怎样才能做到这一点? 我尝试过很多像下面这样的东西,但是我找不到去那个节点的方法。我试图构建一个到该节点的XPath但无法到达那里。可以告诉我那里的xPath应该是什么?

    public bool RemoveTag(string userName, string tagName)
    {
        XmlDocument newDoc = new XmlDocument();
        newDoc.Load(path);

        XPathNavigator navigator = newDoc.CreateNavigator();
        XPathExpression query = navigator.Compile("//marks");
         query = navigator.Compile("//marks/" + tagName);

        XmlNodeList marksNodes = newDoc.GetElementsByTagName("marks");
        XmlNode nodeToDelete=marksNodes[0].SelectSingleNode(userName+"/marks/"+tagName);
        for (int i = 0; i < marksNodes.Count; i++)
        {
            marksNodes[i].RemoveChild(nodeToDelete);
        }
        return status;
    }

1 个答案:

答案 0 :(得分:-1)

我更喜欢在XmlDocument上使用XDocument。 (使用System.Xml.Linq)

XDocument doc = XDocument.Load(path);
foreach(XElement elment in doc.Root.Descendants("english").ToArray())
    elment.Remove();

这会删除元素的所有出现&#34; english&#34;无论他们的位置如何。

更精确的方法:

foreach(XElement markElement in doc.Root.Elements("marks"))
{
    foreach(XElement englishElement in markElement.Elements("english").ToArray())
        english.Remove();
}

这不涉及任何xpath,因此这是解决您问题的替代方案。