2010-07-20 46 views
2

節點選擇屬性,我有以下結構的文件從使用XPath

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

我試圖在sampleDescription評論後走出文本「共有的基因」,我已經用下面的代碼:

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

但都不工作。我錯過了什麼?

回答

0

doc.xpath返回一個節點集,其作用有點像陣列。因此,你需要抓住的第一個元素

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

你也可以使用at_xpath這相當於xpath(foo).first

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

另一個要注意的是在節點上是屬性,如哈希元素訪問 - 與[<key>]

1

可能是一個錯字...你試過doc.xpath("/admin/sampleDescription/@comment").text

+0

是的,這也行不通。還有其他建議嗎? – Bobby 2010-07-20 18:13:00

+0

奇怪 - doc.css('sampleDescription [comment]')。first ['comment']',不然,你安裝了哪個Nokogiri和Ruby版本? – lwe 2010-07-20 20:11:45

1

它不工作,因爲沒有描述元素。正如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。如果您的文檔使用命名空間,並且您沒有用xmlns:指定它,那麼Nokogiri不會返回任何內容。

1

嘗試這種情況:

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

用正確的語法更新了答案。 – 2010-07-20 19:15:47

+0

請注意,'xpath'返回一個節點集,而不是單個節點。 – Phrogz 2011-10-19 17:04:14