使用Scala进行XML解析:相当于JS中的"getElementByTagName(name)"

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中有更好的方法吗?

om-*_*nom 6

你做错了!
我需要的只是
给定此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 深度优先元素将被视为头部.