使用 Scala : Equivalent to "getElementByTagName(name)" in JS 解析 XML

标签 xml scala xpath xml-parsing jvm-languages

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

最佳答案

你做错了!
我所需要的只是特定标签名称的第一个元素
给出这个 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>

附言deep-first 元素将被视为头部。

关于使用 Scala : Equivalent to "getElementByTagName(name)" in JS 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264197/

相关文章:

Scala 包对象构造器

ios - Google 电子表格协议(protocol) "A cell' 的位置无法更新。”

java - 如何在单独的模块中加载多个 Spring ApplicationContext XML?

java - 如何在 NetBeans 6.9 中构建 jar?

xml - 使用 xslt 匹配单独 xml 文件中的元素,然后打印兄弟

python - 使用selenium webdriver python通过xpath登录jsp表单

python - 错误 : "' str' object is not callable"on any use of Xpath

javascript - 我应该如何测试一个对象是否是 XML 文档(以跨浏览器的方式)

xml - 如何在 XML Publisher 报告的最后一页以外的所有页面中打印文本 'Continued..."?这不是报告中的常见要求

scala - 如何以编程方式关闭 fs2.StreamApp?