2010-05-10 42 views
3

我想處理文檔以檢索可能具有多個路徑的值。理想的簽名看起來是這樣的:Scala XML從可選路徑檢索

def value(doc: Elem, potential_paths: List[something]): String 

凡會簡單地處理文檔看potential_paths的頭,如果找到,返回它,否則繼續potential_paths.drop(1)。

對於XPath,「something」將是表示XPath語句的String的簡單列表。由於「\」實際上是NodeSeq的一個功能,因此它不是可以獨立於節點表示的。無論如何,這是什麼方式來處理這個問題?

回答

4

假設路徑爲child/child/child都通過了,那麼你可以進行基本的搜索做到這一點:

def search(doc: NodeSeq, path: String) = 
    path.split('/').foldLeft(doc)(_ \ _) 

處理整個事情可以這樣進行:

def value(doc: Elem, potential_paths: List[String]) = 
    potential_paths.view.map(search(doc, _)).find(_.nonEmpty) 

這是假設的Scala 2.8。在Scala 2.7上,將view替換爲projection,將_.nonEmpty替換爲!_.isEmpty

我在此使用/作爲分隔符,因爲它是XPath字符並避免了引用問題。請注意,沒有領先的/,並且<a><b/></a> \ "a"不會找到任何內容,因爲a不是孩子。

+0

摺疊是純粹的天才。謝謝丹尼爾... – Tim 2010-05-10 15:40:00