You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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")

代码说明

  1. 精准定位节点:直接找到Output节点,避免遍历所有子节点的冗余操作
  2. XPath精准匹配:通过/..取父节点的方式,直接定位到包含目标property的Target节点
  3. 彻底清理再保留:先清空Output所有子节点,再将需要保留的节点克隆后添加,确保无残留
  4. 空值判断:避免节点不存在时引发空引用异常

预期执行结果

<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:55:03