考虑以下 XML 节点:
<Interval>
<P v="1"/>
<Q v="0.0"/>
</Interval>
在 Scala 中模式匹配顶级元素的正确方法是什么?我希望以下内容能够工作,但事实并非如此:
def visit(node:Node):String = {
node match {
case p @ <P/> => (p \ "@v") text
case q @ <Q/> => (q \ "@v") text
case <Interval> @ children:_* </Interval> => "parent"
}
}
最佳答案
当您在 Scala 中创建 XML 文字时,分配给它的变量是顶级元素。
val node: scala.xml.Elem =
<Interval>
<P v="1"/>
<Q v="0.0"/>
</Interval>
要匹配顶级元素(此处为 Interval
),或具有子元素(如您的示例)的 Interval
的任何元素,您可以使用花括号来匹配子元素.
node match {
case <Interval>{ children @_* }</Interval> => children.collect {
case p @ <P/> => p \@ "v"
case q @ <Q/> => q \@ "v"
}
}
结果是:
Seq("1", "0.0")
如果您不熟悉collect
,它允许您提供部分函数(读作“模式匹配”)并忽略否则会因匹配错误而失败的情况。
关于xml - Scala XML 模式匹配,顶级元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55573942/