Nokogiri条件解析

时间:2017-02-08 17:21:08

标签: 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>

<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

但是,我没有得到任何结果!我也意识到这段代码我的效率非常低,所以如果你有建议,请分享!

0 个答案:

没有答案