为什么Nokogiri xpath不像xmlns声明

我正在使用Nokogiri :: XML来解析Amazon SimpleDB的响应。 响应类似于:

   Foo42 BarXYZ    

如果我直接将响应交给Nokogiri,则所有XPath查询(例如doc/"//Item/Attribute[Name='Foo']/Value" )都会返回一个空数组。 但是,如果我从SelectResponse标记中删除xmlns属性,它将完美地运行。

是否需要做一些额外的事情来解释名称空间声明? 这种解决方法感觉非常像黑客。

该XPath查询查找不在任何名称空间中的元素。 您需要告诉您的XPath处理器您正在寻找命名空间http://sdb.amazonaws.com/doc/2007-11-07/中的元素

使用nokogiri的一种方法是:

 doc = Nokogiri::XML.parse(...) doc.xpath("//aws:Item/aws:Attribute[Name='Foo']/aws:Value", {"aws" => "http://sdb.amazonaws.com/doc/2007-11-07/"}) 

我发现这对了解正在发生的事情非常有帮助: http : //tenderlovemaking.com/2009/04/23/namespaces-in-xml.html

基本上,如果您完全定义了命名空间(通过xmlns= ),则必须在xpath搜索中使用命名空间。

所以在你的情况下,你可以做以下三件事之一:

  • 从根SearchResponse删除xmlns属性。 在这种情况下,您的原始,无名称空间的xpath查询将起作用。
  • 在xpath查询中使用默认命名空间doc/"//xmlns:Item/xmlns:Attribute[xmlns:Name='Foo']/xmlns:Value"
  • xpath方法调用的第二个参数中定义自定义命名空间,并在查询中使用它,如上面的hrnt解决方案中所示