从具有XPath的节点中选择属性

时间:2010-07-20 17:49:14

标签: ruby-on-rails ruby xpath nokogiri

我有一个具有以下结构的文件

<admin>
 <sampleName>Willow oak leaf</sampleName>
 <sampleDescription comment="Total genes">
  <cvParam cvLabel="Bob" accession="123" name="Oak" />      
 </sampleDescription> 
</admin>

我试图在sampleDescription注释后输出“Total genes”文本,我使用了以下代码:

sampleDescription = doc.xpath( "/admin/Description/@comment" )
sampleDescription = doc.xpath( "/admin/Description" ).text

但是都不行。我错过了什么?

4 个答案:

答案 0 :(得分:1)

可能是一个错字......你试过doc.xpath("/admin/sampleDescription/@comment").text吗?

答案 1 :(得分:1)

它没有用,因为没有Description元素。正如Iwe所提到的,你需要做一些像sampleDescription = doc.xpath("/admin/sampleDescription/@comment").to_s

这样的事情

另外,如果是我,我会sampleDescription = doc.xpath("//sampleDescription/@comment").to_s。这是一个更简单的xpath,但它可能会更慢。

作为一个说明,许多人绊倒的是命名空间。如果您的xml文档使用名称空间,请执行sampleDescription = doc.xpath("/xmlns:admin/sampleDescription/@comment").to_s。如果您的doc使用名称空间而您没有使用xmlns:指定它,那么Nokogiri将不会返回任何内容。

答案 2 :(得分:1)

试试这个:

doc.xpath("//admin/sampleDescription/@comment").to_s

答案 3 :(得分:0)

doc.xpath返回一个有点像数组的NodeSet。所以你需要抓住第一个元素

doc.xpath("//admin/sampleDescription").first['comment']

您还可以使用等同于at_xpath

xpath(foo).first
doc.at_xpath("//admin/sampleDescription")['comment']

需要注意的另一件事是节点上的属性像哈希元素一样被访问 - 使用[<key>]