XML:如何删除所有没有属性或子元素的节点

mis*_*153 4 c# xml

我有一个这样的 xml 文档:

<Node1 attrib1="abc">
    <node1_1>
         <node1_1_1 attrib2 = "xyz" />
    </ node1_1>
</Node1>

<Node2 />    
Run Code Online (Sandbox Code Playgroud)

<node2 />是我要删除的节点,因为它没有子节点/元素,也没有任何属性。

Tho*_*mas 5

使用 XPath 表达式可以找到没有属性或子节点的所有节点。然后可以将它们从 xml 中删除。正如 Sani 指出的,您可能必须递归地执行此操作,因为如果删除其内部节点,node_1_1 就会变为空。

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(
@"<Node1 attrib1=""abc"">
        <node1_1>
             <node1_1_1 />
        </node1_1>
    </Node1>
    ");

// select all nodes without attributes and without children
var nodes = xmlDocument.SelectNodes("//*[count(@*) = 0 and count(child::*) = 0]");

Console.WriteLine("Found {0} empty nodes", nodes.Count);

// now remove matched nodes from their parent
foreach(XmlNode node in nodes)
    node.ParentNode.RemoveChild(node);

Console.WriteLine(xmlDocument.OuterXml);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过使用“node()”组合“*”和“text()”的测试并使用并集“|”来合并属性和节点的测试来简化该 XPATH 表达式,以获得计数条件:“// *[count(child::node() | @*) = 0]` (3认同)