4

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
    }
}

它基本上是递归的,直到找到匹配项或用尽所有可能性。

既然需要我拥有此能力的功能已经发布,我已经对此进行了更多审查,这真的让我很烦恼。我确信有许多 Java 库可用于帮助解析 XML,但鉴于 Scala 对生成 XML 的本机支持(即它几乎可以在任何地方内联),我很好奇我是否遗漏了什么。

在 Scala 中有没有更好的方法来做到这一点?

4

1 回答 1

6

你做错了! 我所需要的只是给定这个 xml
的特定标记名的第一个元素:

val page = 
  <root>
    <need>text1</need>
    <doesnotneed>text2</doesnotneed>
    <doesnotneed>text3</doesnotneed>
    <need>text4</need>
  </root>

现在调用此代码将为您提供具有给定标签名称的所有节点的列表:

scala> page \\ "need"
res3: scala.xml.NodeSeq = NodeSeq(<need>text1</need>, <need>text4</need>)

只获得第一个:

scala> page \\ "need" head
res4: scala.xml.Node = <need>text1</need>

PS深优先元素将被视为头部。

于 2011-08-31T22:41:32.423 回答