В первую очередь: я в 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
для соответствия вместо того, чтобы использовать те хорошие литералы? И если: Что лучший способ состоит в том, чтобы сделать это?
Работа с атрибутами - это гораздо большая морока, чем следовало бы. Этот конкретный пример показывает, что Scala не деконструирует XML так же, как она их конструирует, так как этот синтаксис является действительным для XML-литералов. В любом случае, вот способ:
myXML match {
case <a>{b @ <b>{theText}</b>}</a> =>
println("An %s text: %s".format(b \ "@type", theText))
}