我正在使用下面的代码从下面显示的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'
它可以工作,但是当 ns2 命名空间 URL 已经在 XML 文档中时,我不喜欢明确提及它。但我似乎无法从产品标签中检索它。我已经尝试了p results.css('Products').attr('xmlns:n2')
的变体,但我无法获得该工作,它只返回 nil。如何获取Products
标记的 xmlns:n2 属性值?
我的(为简洁起见进行了简化(XML:
<?xml version="1.0"?>
<GetMatchingProductForIdResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetMatchingProductForIdResult Id="028023810000" IdType="UPC" status="Success">
<Products xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
<Product>
<AttributeSets>
<ns2:ItemAttributes xml:lang="en-US">
<ns2:Studio>WECO Electrical Connectors Inc</ns2:Studio>
<ns2:Title>Weco Wonder Shell Natural Minerals (3 Pack), Small</ns2:Title>
</ns2:ItemAttributes>
</AttributeSets>
<Relationships>
<VariationParent>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
<ASIN>B077HQHBQ6</ASIN>
</MarketplaceASIN>
</Identifiers>
</VariationParent>
</Relationships>
<SalesRankings>
<SalesRank>
<ProductCategoryId>pet_products_display_on_website</ProductCategoryId>
<Rank>14863</Rank>
</SalesRank>
</SalesRankings>
</Product>
</Products>
</GetMatchingProductForIdResult>
</GetMatchingProductForIdResponse>
css
和xpath
将返回一个NodeSet
(Enumerable#select
认为(,但你想要实际的Element
本身。
为此nokogiri
提供了at_
前缀的方法,at_css
和at_xpath
,它们将返回第一个匹配Element
。实现非常简单
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"
此外,如果您只需要任何"标题"属性并且名称空间不是必需的,那么
results.xpath("//*[local-name() ='Title']").text
#=> "Weco Wonder Shell Natural Minerals (3 Pack), Small"