Scala XML模式匹配和属性

时间:2010-04-09 19:13:28

标签: 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 _ =>
}

这是我在网上和我的两本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 _ => 
}

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

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

1 个答案:

答案 0 :(得分:17)

处理属性更应该是一种痛苦。事实上,这个特殊的例子表明,Scala不会像构造它那样解构XML 语法 对XML文字有效。无论如何,这是一种方式:

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