Scala XML模式匹配和属性

Mal*_*lax 12 xml scala pattern-matching

首先:我在Scala 2.8

在XML元素上使用模式匹配时,我遇到了一些问题.我知道我可以这样做:

val myXML = <a><b>My Text</b></a>
myXML match {
    case <a><b>{theText}</b></a> => println(theText)
    case _ =>
}
Run Code Online (Sandbox Code Playgroud)

这是我在网上和我的两本Scala书籍中随处可见的那种例子.但是,如果我想根据属性匹配XML元素呢?

val myXML = <a><b type="awesome">An awesome Text!</b></a>
myXML match {
    case <a><b type={textType}>{theText}</b><a> => println("An %s text: %s".format(textType, theText))
    case _ => 
}
Run Code Online (Sandbox Code Playgroud)

编译器将抛出一个error: in XML literal: '>' expected instead of 't'对我,表明我不能使用属性,因为编译器期望元素标记被关闭.如果我尝试将XML元素与固定属性匹配,而没有花括号,则会引发相同的错误.

所以我的问题很简单:我怎么能做这样的比赛?我是否必须Elem为匹配创建一个而不是使用那些不错的文字?如果:最好的方法是什么?

Dan*_*ral 17

处理属性更应该是一种痛苦.这个特殊的例子表明,事实上,Scala没有解构个XML它构造他们以同样的方式,因为这句法有效的XML文本.无论如何,这是一种方式:

myXML match { 
  case <a>{b @ <b>{theText}</b>}</a> => 
    println("An %s text: %s".format(b \ "@type", theText))
}
Run Code Online (Sandbox Code Playgroud)

  • @Malax不是真的,只需在`=>`之前添加`if b \"@type"== Text("whatever")`.或者,或者,`if(b \"@ type").toString =="whatever"`. (3认同)