删除xml文件中具有特定值的子节点

时间:2014-07-22 06:31:57

标签: xml xpath

任何人都可以解释为什么我不能使用此查询删除此子节点。它给出了一个错误,说“System.Xml.dll中发生了'System.ArgumentException'类型的未处理异常。附加信息:要删除的节点不是此节点的子节点。”

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("sample.xml");
        xDoc.RemoveChild(xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists[contains(ListName,'ws_Users')]"));
        xDoc.Save("sample.xml");

xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <Root>
      <Class Name="ECMInstruction" Style="Top">
        <Entity Id="1" Name="DocumentInformation" />
        <Property Id="1">
        </Property>
        <Property Id="2">
          <Lists>
            <ListName>ws_Users</ListName>
             <ListName>dfdfdfd</ListName>
          </Lists>
        </Property>
      </Class>
    </Root>

3 个答案:

答案 0 :(得分:0)

正是因为这个

Lists[contains(ListName,'ws_Users')]

您的xml包含2个名为ListName Lists的子节点。 contains()函数的第一个参数应该只包含一个项目。将其更改为:

Lists[ListName[contains(.,'ws_Users')]]

答案 1 :(得分:0)

未经测试的尝试:

XmlDocument xDoc = new XmlDocument();
xDoc.Load("sample.xml");
var parent = xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists");
var nodeToRemove = parent.SelectSingleNode("ListName[text() = 'ws_Users')]");
parent.RemoveChild(nodeToRemove);
xDoc.Save("sample.xml");

答案 2 :(得分:0)

您需要删除节点的父节点并从该父节点调用.RemoveChild()

XmlDocument xDoc = new XmlDocument();
xDoc.Load("sample.xml");
var nodeTobeRemoved = xDoc.SelectSingleNode("//Class[@Name='ECMInstruction']/Property[@Id='2']/Lists/ListName[contains(.,'ws_Users')]");
nodeTobeRemoved.ParentNode.RemoveChild(nodeTobeRemoved);
xDoc.Save("sample.xml");