根据child中的文本值删除父节点和所有子节点

时间:2015-05-19 04:33:05

标签: xml xpath vbscript xmldom

我正在尝试使用vbscript读取xml文件,如果ATTRIBUTE_DATA包含V-3008,我想删除/删除包含它的整个漏洞.... 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>

1 个答案:

答案 0 :(得分:2)

您希望xpath返回满足条件的<VULN>元素:

......

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

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

......

上面的xpath返回<VULN>,后代元素<ATTRIBUTE_DATA>完全等于"V-3008"

如果您想要部分匹配contains()值,请使用<ATTRIBUTE_DATA>

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