xml - Scala XML 模式匹配,顶级元素

标签 xml scala scala-xml

考虑以下 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/

相关文章:

android - 顺序动画 XML 中的错误

Android:使用 XML 自定义 EditText 布局

json - 使用 json4s.replace 替换 Json AST 中的对象

java - 如何使 scala-maven-plugin 查看由 maven-compiler-plugin 编译的类?

xml - 在 Scala 中,如何使用转换器/重写规则将递增 ID 放入 XML 元素中

xml - XML 架构 (XSD) 中十进制类型的限制是什么?

c# - 使用 Linq 查询 XML 文档

scala - Set 的头和尾是否保证互斥?

css - 如何使用 Binding.scala 声明嵌入式 css

scala - Scala 中 CDATA 中的变量