Ruby Nokogiri条件解析
我需要解析一些非常无序的XML(由我正在使用的第三方应用程序提供) 如果元素Ruby Nokogiri条件解析,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,我需要解析一些非常无序的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/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>
然而,我没有得到任何结果!我也意识到我的代码完全没有效率,所以如果你有建议,请分享 我不能回答,但有趣的是,作业后
rescue nil
是什么意思?我不知道你能做到。谢谢:)@MarkoAvlijaš现在只是一个填充。。。如果没有任何结果,我最终会用一个rescue来填充它?把不必要的东西都拿出来。请读“。我们需要演示问题所需的最少输入。您的代码不是惯用的,但主要问题是您在使用/
启动中间选择器时使用了/
/
表示从DOM的顶部到底部进行搜索/
表示从该点进行搜索。不必使用/X
查找根目录。只需从//获取结果\u响应/result
开始搜索,然后从另一个的xpath
中删除/
,您应该会得到更好的结果。我无法回答,但有趣的是,分配后拯救nil
意味着什么?我不知道你能做到。谢谢:)@MarkoAvlijaš现在只是一个填充。。。如果没有任何结果,我最终会用一个rescue来填充它?把不必要的东西都拿出来。请读“。我们需要演示问题所需的最少输入。您的代码不是惯用的,但主要问题是您在使用/
启动中间选择器时使用了/
/
表示从DOM的顶部到底部进行搜索/
表示从该点进行搜索。不必使用/X
查找根目录。只需使用//get\u results\u response/result
开始搜索,然后从xpath的另一个中删除///code>,您应该会得到更好的结果。
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