2010-05-10 9 views
3

Je souhaite traiter un document pour extraire une valeur pouvant comporter plusieurs chemins. La signature idéale ressemblerait à quelque chose comme:Récupération de Scala XML à partir de chemins facultatifs

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

où il serait tout simplement traiter la doc en regardant la tête des potential_paths, se trouve, le retourner, sinon continuez avec potential_paths.drop (1). Avec XPath, le "quelque chose" serait une simple liste de chaînes représentant les instructions XPath. Puisque le "\" est en fait une fonction du NodeSeq, il n'est pas (apparemment) représentable séparé d'un nœud. Quoi qu'il en soit, quelle est la manière scala-ish d'aborder cela?

Répondre

4

En supposant que les chemins sont passés comme child/child/child, alors vous pouvez le faire pour la recherche de base:

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

traitement la chose pourrait être fait comme ceci:

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

Cela suppose Scala 2.8. Sur Scala 2.7, remplacez view par projection et _.nonEmpty par !_.isEmpty.

J'ai utilisé / comme séparateur ici parce que c'est le caractère XPath et évite les problèmes de citation. Notez qu'il n'y a pas de / et que <a><b/></a> \ "a" ne trouvera rien, car a n'est pas un enfant.

+0

pliage est un pur génie. merci Daniel ... – Tim

Questions connexes