【问题标题】:Remove a parent node and all children based on text value in child根据子节点中的文本值删除父节点和所有子节点
【发布时间】:2015-05-19 04:33:04
【问题描述】:

我正在尝试使用 vbscript 读取 xml 文件,如果 ATTRIBUTE_DATA 包含 V-3008,我想删除/删除整个 vuln .... 包含它的 vuln。 - 我已经尝试了所有不同的 XPath 变体,但无法找到能够做到这一点的变体。我已经让它删除了包含它的整行,但这并不好。我确实先搜索了这个网站,关于这个主题的内容并不多:https://stackoverflow.com/search?q=xpath+vbscript+remove+node

这是我已经开始的一些基本代码。谢谢你。

Set xmlDoc = _
CreateObject("Microsoft.XMLDOM")
xmlDoc.Async = "False"
xmlDoc.Load("C:\Users\somedude\Desktop\xml-development\myfile.xml")

strVulid = "V-3008"
xpath  = "//CHECKLIST/VULN/STIG_DATA/ ATTRIBUTE_DATA[text() = '" & strVulid & "']/ATTRIBUTE_DATA "

For Each n In XMLDoc.SelectNodes(xpath)
    n.parentNode.removeChild(n)
Next

xmlDoc.Save "C:\Users\somedude\Desktop\xml-development\myfile.xml" 
msgbox "done"

这里是示例 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CHECKLIST>
<SV_VERSION>DISA STIG Viewer : 1.2.0</SV_VERSION>
 <ASSET>
  <ASSET_TYPE>Computing</ASSET_TYPE>
  <HOST_NAME>HOST NAME</HOST_NAME>
  <HOST_IP>IP</HOST_IP>
  <HOST_MAC>MAC</HOST_MAC>
  <HOST_GUID></HOST_GUID>
  <TARGET_KEY></TARGET_KEY>
  <ASSET_VAL>
    <AV_NAME xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">ROLE</AV_NAME>
    <AV_DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Role</AV_DATA>
  </ASSET_VAL>
</ASSET>
<STIG_INFO>
  <STIG_TITLE>Windows 7 Security Technical Implementation Guide</STIG_TITLE>
</STIG_INFO>
<VULN>
  <STIG_DATA>
    <VULN_ATTRIBUTE>Vuln_Num</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>V-3008</ATTRIBUTE_DATA>
  </STIG_DATA>    
  <STIG_DATA>
    <VULN_ATTRIBUTE>Severity</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>medium</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Group_Title</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>IPSec VPN is not configured as a tunnel type VPN.</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Rule_ID</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>SV-3008r1_rule</ATTRIBUTE_DATA>
</STIG_DATA>    
</VULN>  
<VULN>
<STIG_DATA>
    <VULN_ATTRIBUTE>Vuln_Num</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>V-1234</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Severity</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>medium</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Group_Title</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>Some Text</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Rule_ID</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>Srrgs1_rule</ATTRIBUTE_DATA>
</STIG_DATA>    
</VULN>
<VULN>
<STIG_DATA>
    <VULN_ATTRIBUTE>Vuln_Num</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>V-5678</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Severity</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>medium</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Group_Title</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>Some Other Text</ATTRIBUTE_DATA>
</STIG_DATA>    
<STIG_DATA>
    <VULN_ATTRIBUTE>Rule_ID</VULN_ATTRIBUTE>
    <ATTRIBUTE_DATA>dSrrdafgs1_rule</ATTRIBUTE_DATA>
</STIG_DATA>    
</VULN> 
</CHECKLIST>

【问题讨论】:

    标签: xml xpath vbscript xmldom


    【解决方案1】:

    您希望 xpath 返回满足条件的 &lt;VULN&gt; 元素:

    ......
    
    strVulid = "V-3008"
    xpath  = "//CHECKLIST/VULN[STIG_DATA/ATTRIBUTE_DATA = '" & strVulid & "']"
    
    For Each n In XMLDoc.SelectNodes(xpath)
        n.parentNode.removeChild(n)
    Next
    
    ......
    

    xpath 上方返回 &lt;VULN&gt; 具有后代元素 &lt;ATTRIBUTE_DATA&gt; 完全等于 "V-3008"

    如果您要部分匹配 &lt;ATTRIBUTE_DATA&gt; 值,请使用 contains()

    xpath  = "//CHECKLIST/VULN[STIG_DATA/ATTRIBUTE_DATA[contains(.,'" & strVulid & "')]]"
    

    【讨论】:

    • 对于遇到此问题的其他人,NiMa 的解决方案正是我所需要的,并且可以按要求工作。我很欣赏迅速的反应。作为新人,也许我可以尽快付款。
    • @OrionEllis 仅供参考,NiMa 编辑了您的问题以改进标题,这是我的答案:)。知道您是 SO 的新手,我建议您阅读以下内容:stackoverflow.com/help/someone-answers。顺便说一句,第一个问题很好!
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2022-09-27
    相关资源
    最近更新 更多