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

Ruby/Nokogiri xmlns和其他通过xpath的扩展,ruby,xpath,nokogiri,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> 但它似乎不起作用。 你能帮帮我吗,我是Ruby的新手,我搜索了很多,但什么也

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

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

<node> 
<price add:cars="90000"/>
</node>
</rspec>
但它似乎不起作用。
你能帮帮我吗,我是Ruby的新手,我搜索了很多,但什么也没找到

有一种方法可以做到这一点:

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"

阅读本教程:

我非常喜欢让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"
需要“nokogiri”
xml='1〕
'
doc=Nokogiri::XML(XML)
在('price','add')['add:cars']处的文件
# => "90000"

添加:cars
price
元素的属性,而不是元素本身。您需要的语法是:

root.xpath("//xmlns:price/@add:cars")
甚至可能只是

root.xpath("//@add:cars")
如果需要所有元素的
添加:cars
属性


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

非常感谢您的回答,但我确实需要保留名称空间,因为我的代码中有许多同名(car)的节点。我能做些不同的事吗?再次感谢!非常感谢您的回复!我还有一个问题。你能告诉我,如果我有三个“节点”节点,我只想提取第三个节点的价格,我该怎么办?我非常感谢你的帮助@杰克,你真的不应该问这样的评论。这种情况看起来相当简单,您需要类似于
//xmlns:node[3]/xmlns:price/@add:cars
的东西。
[3]
指定了第三个
节点
节点,其余的节点与以前基本相同。如果这不是你想要的,那么打开一个新问题——你会有更多的空间来解释和格式化你的问题,你会得到更好的回答,因为更多的人会看到它。我只是觉得我不应该单独问这样一个类似的问题。我会记住这一点。非常感谢您的及时回复!
root.xpath("//xmlns:price/@add:cars")
root.xpath("//@add:cars")