2009-04-22 22 views
2

好吧,我有一個XML文檔看起來是這樣的:遍歷XML結構,以確定是否有一定的文本節點存在

<xml> 
    <list> 
     <partner> 
     <name>Some Name</name> 
     <status>active</status> 
     <id>0</id> 
     </partner> 
     <partner> 
     <name>Another Name</name> 
     <status>active</status> 
     <id>1</id> 
     </partner> 
    </list> 
    </xml> 

我使用紅寶石的lib-XML解析它。 我想以快速和紅寶石的慣用方式找到名稱爲「Some Name」的合作伙伴。

如何在一行或者ruby代碼中做到這一點,假設我有一個在名爲document的變量中解析的文檔..這樣我就可以調用document.find(xpath)來檢索節點。我必須在略有不同的情況下多次執行此操作,現在它開始出現問題。

我知道我可以做以下(但其醜陋的)

found = false 
document.find('//partner/name').each do |name| 
    if (name.content == 'Some Name') 
    found = true 
    break 
    end 
end 
assert(found, "Some Name should have been found") 

,但我覺得這很醜陋。我想過使用枚舉包括? mixin的方法,但仍然不會工作,因爲我需要得到每個節點的.content字段,而不是實際的節點... 雖然寫這個,雖然這(但它似乎有點低效,雖然優雅)

found = document.find('//partner/name').collect{|name| name.content}.member?("Some Name") 

還有其他的方法嗎?

回答

2

這是怎麼回事?

found = document.find("//partner[name='Some Name']").empty? 
0

我會使用本地操作XML的語言(例如XQuery)。使用XQuery,可以通過簡潔和優雅的方式來制定這種通過xml數據進行的查詢。

2

我試過這個解決方案:

found = document.find("//partner[name='Some Name']") != nil 

但我得到了一個錯誤說XPath表達式是無效的。 但是,我正在閱讀一些xpath文檔,它看起來像你可以在表達式中調用text()函數來獲取文本節點。我試過以下,它似乎工作:

found = document.find("//partner/name/text()='Some Name'") 

居然發現不是XML節點,但真/假對象,因此這個工程。

+1

第一個XPath適用於libxml-ruby和Nokogiri,所以我不確定它爲什麼會給你一個無效的XPath錯誤。值得注意的是,'!= nil`可能無法達到你想要的效果 - 即使在沒有匹配的情況下,你也會收到回收。你可能想要使用.empty?檢查是否有任何東西被發現。 – 2009-04-22 23:33:11