Scala XML-шаблонов и атрибутов - PullRequest
12 голосов
/ 09 апреля 2010

Прежде всего: я на 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 Ответ

17 голосов
/ 09 апреля 2010

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

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