在下面的代码中,我试图使用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的新手,我搜索了很多,但我找不到任何东西。
答案 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"
答案 1 :(得分:1)
add:cars
是price
元素的属性,而不是元素本身。您想要的语法是:
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"