Jay*_*lor 4 xml xpath scala jvm-languages xml-parsing
Scala中的XML解析似乎并不像应该的那样容易和直接.
我需要的是与JavaScript中的document.getElementsByTagName(name)类似的东西,但出于我的目的,我所需要的只是特定标记名的第一个元素.这是我最终得到的:
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
}
}
Run Code Online (Sandbox Code Playgroud)
它基本上都会一直进行,直到找到匹配或所有可能性都用完为止.
既然已经发布了我具备此功能所需的功能,我已经对此进行了更多评论,这真的让我感到困惑.我确信有许多Java库可用于帮助解析XML,但考虑到Scala用于生成XML的原生支持(即它几乎可以在任何地方进行内联),我很好奇我是否遗漏了某些内容.
在Scala中有更好的方法吗?
你做错了!
我需要的只是
给定此xml 的特定标记名称的第一个元素:
val page =
<root>
<need>text1</need>
<doesnotneed>text2</doesnotneed>
<doesnotneed>text3</doesnotneed>
<need>text4</need>
</root>
Run Code Online (Sandbox Code Playgroud)
现在调用此代码将为您提供具有给定标记名称的所有节点的列表:
scala> page \\ "need"
res3: scala.xml.NodeSeq = NodeSeq(<need>text1</need>, <need>text4</need>)
Run Code Online (Sandbox Code Playgroud)
只获得第一个:
scala> page \\ "need" head
res4: scala.xml.Node = <need>text1</need>
Run Code Online (Sandbox Code Playgroud)
PS 深度优先元素将被视为头部.