我正在尝试使用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>
答案 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 & "')]]"