Scala XML извлечение из необязательных путей - PullRequest
3 голосов
/ 10 мая 2010

Я хочу обработать документ, чтобы получить значение, которое может иметь более одного пути. Идеальная подпись будет выглядеть примерно так:

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

Там, где он просто обработал бы документ, глядя на начало потенциальных_путей, если он найден, верните его, в противном случае продолжите с параметром потенциальных_путей (1).

В XPath «что-то» будет простым списком строк, представляющих операторы XPath. Поскольку «\» на самом деле является функцией NodeSeq, он (очевидно) не может быть представлен отдельно от узла. Во всяком случае, как к этому подойти?

1 Ответ

4 голосов
/ 10 мая 2010

Предполагая, что пути передаются как 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 не ребенок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...