我想处理一个文档以检索可能有多个路径的值。理想的签名看起来像是:
def value(doc: Elem, potential_paths: List[something]): String
只需处理查看potential_paths头部的文档,如果找到,则返回它,否则继续使用potential_paths.drop(1)。
使用XPath,“something”将是表示XPath语句的String的简单列表。由于“\”实际上是NodeSeq的一个函数,因此它(显然)不能与节点分开表示。无论如何,scala-ish的方法是什么?
答案 0 :(得分: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
不是孩子。