Ruby 使用Nokogiri检索XML命名空间

Ruby 使用Nokogiri检索XML命名空间,ruby,nokogiri,Ruby,Nokogiri,我使用下面的代码从如下所示的XML中检索ns2:Title标记的内容 到目前为止,我所拥有的: results = Nokogiri::XML(search_results) p results.xpath '//ns2:Title', 'ns2': 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd' 它可以工作,但我不喜欢在XML文档中已经存在ns2名称空间URL时,必须显式地提到它。但我似乎无法从产品

我使用下面的代码从如下所示的XML中检索ns2:Title标记的内容

到目前为止,我所拥有的:

results = Nokogiri::XML(search_results)
p results.xpath '//ns2:Title', 'ns2': 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd'
它可以工作,但我不喜欢在XML文档中已经存在ns2名称空间URL时,必须显式地提到它。但我似乎无法从产品标签中检索它。我已经尝试了
p results.css('Products').attr('xmlns:n2')
的变体,但我无法完成这项工作,它只返回nil。如何获取
Products
标记的xmlns:n2属性值

My(为简洁起见简化)XML:


威科电气连接器公司
Weco Wonder Shell天然矿物(3包),小型
ATVPDKIKX0DER
B077HQHBQ6
宠物产品在网站上展示
14863

css
xpath
将返回一个
NodeSet
(思考
可枚举#选择
),但您需要实际的
元素本身

为此,
nokogiri
提供了
at
前缀方法、
at-css
at-xpath
,它们将返回第一个匹配的
元素。实现非常简单

css(*args).first 
因此,为了获得您正在寻找的名称空间,以下两种方法中的任何一种都可以使用,并且它们在本质上是相同的

 results.css('Products').first.namespaces['xmlns:ns2']
 #=> "http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"
 results.at_css('Products').namespaces['xmlns:ns2']
 #=> "http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"
但是,如果您的唯一目标是“ns2:Title”元素,那么

results.xpath("//*[name() = 'ns2:Title']").text
#=> "Weco Wonder Shell Natural Minerals (3 Pack), Small"
另外,如果您只需要任何“Title”属性,那么名称空间就不重要了

results.xpath("//*[local-name() ='Title']").text
#=> "Weco Wonder Shell Natural Minerals (3 Pack), Small"

尝试删除名称空间,以便更容易查找<代码>结果。删除名称空间.xpath()
而不是
.css()
调用,并启用其名称空间功能。
results.xpath("//*[local-name() ='Title']").text
#=> "Weco Wonder Shell Natural Minerals (3 Pack), Small"