Ruby 在使用nokogiri解析的xml中,找不到元素的属性名值
我有以下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
<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"]