使用XmlDocument筛选XML节点失败:保留含value=Html的Target节点
XML节点筛选与移除功能修复
原XML文档
<?xml version="1.0"?> <report> <feature tag="Config"/> <feature tag="Runtime"> <feature tag="Output"> <feature tag="Target"> <property name="type" editable="false" visible="true" required="false" value="Html"/> <property name="driver" editable="false" visible="true" required="false" value="Telelogic.Html.Driver"/> </feature> <feature tag="Target"> <property name="type" editable="false" visible="true" required="false" value="Word"/> <property name="driver" editable="false" visible="true" required="false" value="Telelogic.Word.Driver"/> </feature> <feature tag="Target"> <property name="type" editable="false" visible="true" required="false" value="PDF"/> <property name="driver" editable="false" visible="true" required="false" value="Telelogic.Pdf.Driver"/> </feature> </feature> <feature tag="Log"/> </feature> </report>
需求
- 读取
Output节点下所有Target子节点 - 查找包含
value="Html"的property节点对应的Target - 仅保留该
Target节点,移除Output下其他所有节点
原代码问题
原代码使用node.RemoveAll()仅清空节点内容,并未从父节点删除该节点,导致残留空<feature>标签;同时逻辑判断的是Word而非需求的Html,不符合预期。
原代码:
Dim doc As New XmlDocument Dim nodes As XmlNodeList doc.Load(Path) nodes = doc.SelectNodes("/report/feature[@tag='Runtime']/feature[@tag='Output']/feature[@tag='Target']") For Each node As XmlNode In nodes If node.ChildNodes(0).Attributes("value").Value <> "Word" Then node.RemoveAll() End If Next doc.Save("c:\temp\test.xml")
修正后的代码
Dim doc As New XmlDocument doc.Load(Path) ' 定位到Output节点 Dim outputNode As XmlNode = doc.SelectSingleNode("/report/feature[@tag='Runtime']/feature[@tag='Output']") If outputNode IsNot Nothing Then ' 直接找到需要保留的Target节点(包含value="Html"的type属性) Dim targetToKeep As XmlNode = outputNode.SelectSingleNode("feature[@tag='Target']/property[@name='type' and @value='Html']/..") ' 清空Output下所有子节点 outputNode.RemoveAll() ' 若找到目标节点,克隆后添加回Output If targetToKeep IsNot Nothing Then outputNode.AppendChild(targetToKeep.CloneNode(True)) End If End If doc.Save("c:\temp\test.xml")
代码说明
- 精准定位节点:直接找到
Output节点,避免遍历所有子节点的冗余操作 - XPath精准匹配:通过
/..取父节点的方式,直接定位到包含目标property的Target节点 - 彻底清理再保留:先清空
Output所有子节点,再将需要保留的节点克隆后添加,确保无残留 - 空值判断:避免节点不存在时引发空引用异常
预期执行结果
<?xml version="1.0"?> <report> <feature tag="Config"/> <feature tag="Runtime"> <feature tag="Output"> <feature tag="Target"> <property name="type" editable="false" visible="true" required="false" value="Html"/> <property name="driver" editable="false" visible="true" required="false" value="Telelogic.Html.Driver"/> </feature> </feature> <feature tag="Log"/> </feature> </report>
内容的提问来源于stack exchange,提问作者Manfred Singer
相关产品推荐
相关产品推荐

