Ruby 使用Nokogiri检索XML命名空间
我使用下面的代码从如下所示的XML中检索ns2:Title标记的内容 到目前为止,我所拥有的: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时,必须显式地提到它。但我似乎无法从产品
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"
尝试删除名称空间,以便更容易查找<代码>结果。删除名称空间然后是results.css('Products//Title')尝试.xpath()
而不是.css()
调用,并启用其名称空间功能。
results.xpath("//*[local-name() ='Title']").text
#=> "Weco Wonder Shell Natural Minerals (3 Pack), Small"