使用Scala进行XML解析:相当于;getElementByTagName(名称)";在JS中

使用Scala进行XML解析:相当于;getElementByTagName(名称)";在JS中,xml,scala,xpath,xml-parsing,jvm-languages,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: Str

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>
val页=
文本1
文本2
文本3
文本4
现在调用此代码将为您提供具有给定标记名的所有节点的列表:

scala> page \\ "need"
res3: scala.xml.NodeSeq = NodeSeq(<need>text1</need>, <need>text4</need>)
scala>页面\\“需要”
res3:scala.xml.NodeSeq=NodeSeq(text1,text4)
要仅获取第一个:

scala> page \\ "need" head
res4: scala.xml.Node = <need>text1</need>
scala>页面\\“需要”标题
res4:scala.xml.Node=text1

另外,deep first元素将被视为head元素。

我建议使用(添加标记)来处理XML选择。这是一篇关于处理和更新的文章。我认为
n\\search
有问题。你能解释一下是什么吗?太棒了,我没意识到lift json DSL语法在其他地方也被使用过。谢谢