11
votes

Recherchez tous les nœuds qui ont un attribut qui correspond à une certaine valeur avec SCALA

J'ai vu l'exemple suivant sur NABLE , où l'objectif était de renvoyer tous les nœuds contenant un attribut avec un identifiant de x contenant une valeur Y: xxx pré>

comme une extension à cette Comment effectuer ce qui suit: Recherchez tous les nœuds contenant n'importe quel attribut contenant une valeur de Y: P>

val testResults = (xml \\ "_").filter(attributeEquals("_","test")) 


1 commentaires

J'ai trouvé que XPath Language est plus simple github.com/nrinaudo/kantan.xpath et compile temps de sécurité à Scala


5 Réponses :


0
votes

Je suis tout à fait nouveau à Scala, je vous propose cette solution, mais je ne suis pas sûr que ce soit le meilleur:

def attributeValueEquals(value: String)(node: Node) = {
  node.attributes.foldLeft(false)((a : Boolean, x : MetaData) => a | (x.value == value))
}

val testResults = (xml \\ "_").filter(attributeValueEquals("test")) 
println("testResults: " + testResults )

// prints: testResults: ArrayBuffer(<span class="test">hello</span>, 
// <div id="test"><p>hello</p></div>, 
// <random any="test"></random>)


0 commentaires

0
votes
def nodeHasValue(node:Node,value:String) = node.attributes.value != null && node.attributes.value.contains(value)

(x \\ "_").filter( nodeHasValue(_,"test"))

2 commentaires

Je suggérerais la réponse de Maxme pour le currying, mais ma réponse à l'utilisation de "contient" plutôt qu'un pli. Combinez-les!


Eh bien, la réponse de Daniel bat les deux. Gloire.



20
votes

Premier, XML sont des littéraux dans Scala, donc: xxx

maintenant, quant au problème: xxx

en fait, je "D avoir utilisé" existe "au lieu de" filtre "et" défini "pour le problème d'origine aussi.

Enfin, je préfère personnellement la syntaxe de style opérateur, en particulier lorsque vous avez une fonction prête, au lieu d'un anonyme, de passer à " filtre ": xxx

L'original mélange style opérateur pour " \\ " et style dot pour " filtre ", qui finit assez moche.


1 commentaires

Si vous utilisez SCALA 2.9.1, veuillez consulter cette réponse Stackoverflow.com/questions/3819485/... (cette réponse sélectionnée renvoie une nodaleq () sur 2.9.1



3
votes

Code Snippet dans la question ne fonctionne pas avec SCALAA 2.8 - En raison de cette comparaison

(_ == value)


0 commentaires

3
votes

Les solutions précédentes ne fonctionnaient pas pour moi car elles recherchent tous toute valeur em> correspondant. Si vous voulez rechercher un attribut particulier em> avec une valeur, voici ma solution:

getByAtt(xml, "class", "test")


0 commentaires