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: 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"))
5 Réponses :
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>)
def nodeHasValue(node:Node,value:String) = node.attributes.value != null && node.attributes.value.contains(value) (x \\ "_").filter( nodeHasValue(_,"test"))
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.
Premier, XML sont des littéraux dans Scala, donc: maintenant, quant au problème: p> en fait, je "D avoir utilisé" 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 à " L'original mélange style opérateur pour " existe code> "au lieu de"
filtre code> "et"
défini code> "pour le problème d'origine aussi. P>
filtre code>": p>
\\ code>" et style dot pour "
filtre code>", qui finit assez moche. p> p>
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
Code Snippet dans la question ne fonctionne pas avec SCALAA 2.8 - En raison de cette comparaison
(_ == value)
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")
J'ai trouvé que XPath Language est plus simple github.com/nrinaudo/kantan.xpath et compile temps de sécurité à Scala