2009-12-22 4 views
1

Sur cette this post, je besoin d'un moyen propre pour extraire les nœuds d'une compréhension pour que si elles avaient des valeurs d'attributs spécifiques. Voici ce que je suis venu avec:nœuds quand ils n'extrayant que possèdent des attributs spécifiques avec des valeurs spécifiques

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs.map { p => 
    n.attribute(p._1).exists(_ == p._2) 
    } reduceLeft(_ && _) 

Et voici un exemple qui l'utilise pour extraire des objets élément d'un flux d'atomes.

def parseAtomItems(ns: NodeSeq) = ns \\ "entry" flatMap { i => 
    for(
    t <- i \ "title"; 
    l <- i.\("link").filter(attributeValue(
     "type" -> "text/html", 
     "rel" -> "alternate" 
     ).flatMap(_.attribute("href")) 
    ) yield FeedItem(t text, l text) 
} 

Ma question est la suivante: existe-t-il un moyen plus propre/plus idiomatique d'implémenter attributeValue?

Répondre

2

Je pense que le code est assez bon, en fait. Je ferais ceci:

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs forall { 
    case (key, value) => n attribute key exists (_ == value) 
    } 

Alternativement,

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs forall { 
    case (key, value) => n \ ("@"+key) exists (_ == value) 
    } 

Le principal avantage forall sur reduceLeft étant que l'ancien arrêtera au premier résultat faux, alors que ce dernier itérer sur chaque touche/paire de valeurs, même si une fausse correspondance est garantie.

+0

Iterable # forall - c'est la pièce manquante. Je suis ouvert à d'autres réponses, mais qui est assez agréable Daniel, je vous remercie! – Chris

Questions connexes