Подтвердить что ты не робот

Scala Соответствие XML-атрибутов и атрибуты

Прежде всего: я нахожусь в 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 для матча вместо использования этих хороших литералов? И если: Каков наилучший способ сделать это?

4b9b3361

Ответ 1

Обработка атрибутов - это скорее боль, чем она должна быть. В этом конкретном примере фактически показано, что Scala не деконструирует XML так же, как он их конструирует, так как это синтаксис действителен для XML-литералов. В любом случае, вот путь:

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