在使用XML匹配表达式的Scala中,我得到了错误:Scala.MatchError。我做错了什么?

在使用XML匹配表达式的Scala中,我得到了错误:Scala.MatchError。我做错了什么?,xml,scala,Xml,Scala,我正在尝试使用Scala访问XML文档中的特定信息 我用下面这个例子来说明我的问题 我创建了这个XML“文档”,它的类为scala.XML.Elem: val testxml = <Object><Identity Type="Has a Type"/><Reality>"true"</Reality></Object> val testxml=“true” 我想使用以下匹配表达式访问“Identity”属性: testxml ma

我正在尝试使用Scala访问XML文档中的特定信息

我用下面这个例子来说明我的问题

我创建了这个XML“文档”,它的类为scala.XML.Elem:

val testxml = <Object><Identity Type="Has a Type"/><Reality>"true"</Reality></Object>
val testxml=“true”
我想使用以下匹配表达式访问“Identity”属性:

testxml match{

  case <Reality>{value}</Reality> => println("Congratulations the XML has a Reality!: $value ")

  case identity @ <Identity /> =>
    val typ = identity \ "@Type"
    println(s"Type is: $typ")
}
testxml匹配{
case{value}=>println(“恭喜XML实现了:$value”)
案例标识@=>
val typ=identity\“@Type”
println(s“类型为:$typ”)
}
我试图转换为字符串,nodeseq,但它不起作用。我希望给我的输出像“恭喜你……”:真的 “类型为:具有类型”

但我一直在犯错误:

scala.MatchError:(属于scala.xml.Elem类)

我做错了什么


Greetz.

您可能需要添加一个默认匹配案例来捕获其他匹配:

case _ => println("Somethin else...")

match
不递归搜索

更像:

scala> testxml.child map { case <Reality>{ realities @ _* }</Reality> => realities
     | case id @ <Identity/> => id \ "@Type" }
res5: Seq[Seq[scala.xml.Node]] = ArrayBuffer(Has a Type, ArrayBuffer(&quot;true&quot;))
scala>testxml.child映射{case{realities@}=>realities
|案例id@=>id\“@Type”}
res5:Seq[Seq[scala.xml.Node]=ArrayBuffer(具有类型ArrayBuffer(“true”))
编辑:

scala>testxml.child flatMap{case{realities@*}=>realities case id@=>id\“@Type”}
res2:Seq[scala.xml.Node]=ArrayBuffer(类型为“true”)

事实上,这一点没有实现。但现在我只得到默认的匹配大小写。是的,我得到的值现在作为ArrayBuffer返回。它正在工作。但是如何用映射表达式返回缓冲区的值呢?这是一个广泛的问题。也许你是说我们应该把它压平。
scala> testxml.child flatMap { case <Reality>{ realities @ _* }</Reality> => realities case id @ <Identity/> => id \ "@Type" }
res2: Seq[scala.xml.Node] = ArrayBuffer(Has a Type, &quot;true&quot;)