Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Nokogiri条件解析_Ruby_Xml_Nokogiri - Fatal编程技术网

Ruby Nokogiri条件解析

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>

我需要解析一些非常无序的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>

然而,我没有得到任何结果!我也意识到我的代码完全没有效率,所以如果你有建议,请分享

我不能回答,但有趣的是,作业后
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