我需要解析一些非常无组织的XML(由我使用的第三方应用程序提供)。
如果元素result/nvt/cve
有一个值(除了' NOCVE'),我需要保存某些值。
一些XML,包括“NOCVE'和CVE:
<X>
<result id="8791e80e-f254-479f-907e-e2667f57246b">
<nvt oid="1.3.6.1.4.1.25623.1.0.111038">
<cve>NOCVE</cve>
.......
</result>
<result id="c1bf6c4e-1192-418a-bb2c-a3e3376dd42f">
<name>Dropbear SSH CRLF Injection Vulnerability</name>
<detection>
<result id="1817a9ea-379f-41ad-9450-e2c1d6d73f9b">
<details>
<detail>
<name>source_name</name>
<value>Dropbear SSH Detection</value>
</detail>
</details>
</result>
</detection>
<host>10.10.10.1</host>
<port>2222/tcp</port>
<nvt oid="1.3.6.1.4.1.25623.1.0.807740">
<name>Dropbear SSH CRLF Injection Vulnerability</name>
<cve>CVE-2016-3116</cve>
</nvt>
</result>
</X>
在这种情况下,第二个XML result
元素有<cve>CVE-2016-3116</cve>
,而第一个元素有<cve>NOCVE</cve>
。
我尝试搜索我的文档,确定<cve></cve>
是否具有NOCVE
以外的值,然后将各种元素文本保存到变量中供以后使用:
doc = File.open("results.xml") { |f| Nokogiri::XML(f) }
root = doc.xpath("/X/get_results_response")
root.xpath("//result").each do |result|
if result.at_xpath("//nvt/cve").text != 'NOCVE'
result_id = result.at_xpath("@id").value
host = result.at_xpath("host").text rescue nil
cve = result.at_xpath("//nvt/cve").text
puts "#{result_id} #{host} - #{cve}"
end
end
但是,我没有得到任何结果!我也意识到这段代码我的效率非常低,所以如果你有建议,请分享!