Ruby 在使用nokogiri解析的xml中,找不到元素的属性名值

Ruby 在使用nokogiri解析的xml中,找不到元素的属性名值,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,我有以下XML: <cpe-list> <cpe-item name="cpe:/a:1024cms:1024_cms:0.7"> <title xml:lang="en-US">1024cms.org 1024 CMS 0.7</title> <meta:item-metadata nvd-id="121218" status="DRAFT" modification-date="2010-12-14T19:38:3

我有以下XML:

<cpe-list>  
  <cpe-item name="cpe:/a:1024cms:1024_cms:0.7">
    <title xml:lang="en-US">1024cms.org 1024 CMS 0.7</title>
    <meta:item-metadata nvd-id="121218" status="DRAFT" modification-date="2010-12-14T19:38:32.197Z"/>
  </cpe-item>
  <cpe-item name="cpe:/a:1024cms:1024_cms:1.2.5">
    <title xml:lang="en-US">1024cms.org 1024 CMS 1.2.5</title>
    <meta:item-metadata nvd-id="121219" status="DRAFT" modification-date="2010-12-14T19:38:32.240Z"/>
  </cpe-item>
    <cpe-item name="cpe:/h:cisco:ips_4240">
    <title xml:lang="ja-JP">JAPAN IPS 4240 Sensor</title>
    <title xml:lang="en-US">EN Cisco IPS 4240 Sensor</title>
    <meta:item-metadata nvd-id="138255" status="DRAFT" modification-date="2011-01-12T14:36:11.990Z"/>
  </cpe-item>
</cpe-list>
返回

 => [] 

请告知如何正确获取这些字段的值

该属性具有名称空间(它是
xml:lang
,而不仅仅是
lang
),因此您需要在搜索中包含名称空间:

doc.search("//title[@xml:lang='en-US']")
我只是在本地尝试了一下,它返回了所有三个
元素。要获取每个的文本,只需对每个调用
text
,或使用
map

doc.search("//title[@xml:lang='en-US']").map(&:text)
# => [ "1024cms.org 1024 CMS 0.7",
#      "1024cms.org 1024 CMS 1.2.5",
#      "EN Cisco IPS 4240 Sensor" ]

Nokogiri支持CSS选择器,所以我会这样做:

require 'nokogiri'

xml = '<cpe-list>  
  <cpe-item name="cpe:/a:1024cms:1024_cms:0.7">
    <title xml:lang="en-US">1024cms.org 1024 CMS 0.7</title>
    <meta:item-metadata nvd-id="121218" status="DRAFT" modification-date="2010-12-14T19:38:32.197Z"/>
  </cpe-item>
  <cpe-item name="cpe:/a:1024cms:1024_cms:1.2.5">
    <title xml:lang="en-US">1024cms.org 1024 CMS 1.2.5</title>
    <meta:item-metadata nvd-id="121219" status="DRAFT" modification-date="2010-12-14T19:38:32.240Z"/>
  </cpe-item>
    <cpe-item name="cpe:/h:cisco:ips_4240">
    <title xml:lang="ja-JP">JAPAN IPS 4240 Sensor</title>
    <title xml:lang="en-US">EN Cisco IPS 4240 Sensor</title>
    <meta:item-metadata nvd-id="138255" status="DRAFT" modification-date="2011-01-12T14:36:11.990Z"/>
  </cpe-item>
</cpe-list>
'

doc = Nokogiri::XML(xml)
doc.at('title:nth-of-type(2)').to_xml # => "<title xml:lang=\"en-US\">EN Cisco IPS 4240 Sensor</title>"
doc.at('//title[2]').to_xml # => "<title xml:lang=\"en-US\">EN Cisco IPS 4240 Sensor</title>"
在这两种情况下,如果需要的话,您可以使用CSS和/或XPath查看参数及其值的功能来扩展选择器,使其更显式,但是,根据示例XML,您没有这样做

这将查找所有匹配的
标记的文本:

doc.search('title[xml|lang="en-US"]').map(&:text) # => ["1024cms.org 1024 CMS 0.7", "1024cms.org 1024 CMS 1.2.5", "EN Cisco IPS 4240 Sensor"]
在“名称空间”一节中讨论了如何处理名称空间,这是一本重要的阅读材料

doc.at('title:nth-of-type(2)').text # => "EN Cisco IPS 4240 Sensor"
doc.at('//title[2]').text # => "EN Cisco IPS 4240 Sensor"
doc.search('title[xml|lang="en-US"]').map(&:text) # => ["1024cms.org 1024 CMS 0.7", "1024cms.org 1024 CMS 1.2.5", "EN Cisco IPS 4240 Sensor"]