Ruby / Nokogiri xmlns和其他通过xpath的扩展

时间:2013-11-26 21:31:23

标签: ruby xpath nokogiri

在下面的代码中,我试图使用xpath拉出'90000'元素,但Nokogiri返回nil

<?xml version="1.0" encoding="UTF-8"?>
<rspec xmlns="URL1"
xmlns:add="URL2"> 

<node> 
<price add:cars="90000"/>
</node>
</rspec>

我尝试命令:

puts  root.xpath("//add:cars", "add" => "URL2")

但它似乎不起作用。 你能不能帮助我,我是Ruby的新手,我搜索了很多,但我找不到任何东西。

3 个答案:

答案 0 :(得分:1)

以下是一种方法:

require 'nokogiri'

@doc = Nokogiri::XML.parse <<-eotl
<?xml version="1.0" encoding="UTF-8"?>
<rspec xmlns="URL1"
xmlns:add="URL2"> 

<node> 
<price add:cars="90000"/>
</node>
</rspec>
eotl

@doc.remove_namespaces!
@doc.at_xpath('//price/@cars').text
# => "90000"

或(如果你想保留命名空间,请在下面使用)

@doc.at_xpath('//xmlns:price/@add:cars').text
# => "90000"

阅读本教程:Searching an HTML / XML Document

答案 1 :(得分:1)

add:carsprice元素的属性,而不是元素本身。您想要的语法是:

root.xpath("//xmlns:price/@add:cars")

或甚至可能只是

root.xpath("//@add:cars")

如果您想要所有元素的add:cars属性。

请注意,由于命名空间是在根目录上声明的,因此Nokogiri会自动注册它们,因此您不需要在调用xpath时包含映射(如果文档更复杂,则需要包含它们)在非根元素上声明名称空间)。默认命名空间也使用前缀xmlns注册,因此您可以在XPath中使用它。

答案 2 :(得分:0)

我喜欢让Nokogiri在处理命名空间时使用CSS:

require 'nokogiri'

xml = '<?xml version="1.0" encoding="UTF-8"?>
<rspec xmlns="URL1"
xmlns:add="URL2"> 

<node> 
<price add:cars="90000"/>
</node>
</rspec>
'

doc = Nokogiri::XML(xml)
doc.at('price', 'add')['add:cars']
# => "90000"