Análisis XML con Scala: Equivalente a "getElementByTagName(name)" en JS
xpath xml-parsing (1)
¡Lo estás haciendo mal!
todo lo que necesitaba era el primer elemento de un nombre de etiqueta en particular
dado este xml:
val page =
<root>
<need>text1</need>
<doesnotneed>text2</doesnotneed>
<doesnotneed>text3</doesnotneed>
<need>text4</need>
</root>
Ahora llamar a este código le dará una lista de todos los nodos con nombre de etiqueta dado:
scala> page // "need"
res3: scala.xml.NodeSeq = NodeSeq(<need>text1</need>, <need>text4</need>)
Para obtener solo el primero:
scala> page // "need" head
res4: scala.xml.Node = <need>text1</need>
El elemento PS deep-first se trataría como head.
El análisis XML en Scala no parece ser tan fácil y sencillo como debería ser.
Lo que necesitaba era algo que se comportara de manera similar a document.getElementsByTagName (name) en JavaScript, pero para mis propósitos todo lo que necesitaba era el primer elemento de un nombre de etiqueta en particular. Aquí es a lo que terminé:
import scala.xml.{Document, Elem, Node}
import scala.xml.parsing.ConstructingParser
def _getFirstMatchingElementByName(search: String, n: Node): Option[Node] = {
if (n.label == search) {
Some(n)
} else {
var i = 0
var result: Option[Node] = None
try {
while (result == None) {
result = _getFirstMatchingElementByName(search, n.child(i))
i += 1
}
} catch {
case e: IndexOutOfBoundsException => None
}
result
}
}
Básicamente se repite hasta que se encuentra una coincidencia o se agotan todas las posibilidades.
Ahora que se ha lanzado la función que requería que tuviera esta habilidad, la he revisado un poco más y realmente me molesta. Estoy seguro de que hay muchas bibliotecas de Java disponibles para ayudar a analizar XML, pero dado el soporte nativo que tiene Scala para generar XML (es decir, puede simplemente estar en línea en cualquier lugar), tengo curiosidad de saber si me falta algo.
¿Hay una mejor manera de hacer esto en Scala?