2010-05-10 39 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