Сопоставление с образцом 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 для соответствия вместо того, чтобы использовать те хорошие литералы? И если: Что лучший способ состоит в том, чтобы сделать это?

12
задан bstpierre 1 April 2013 в 01:45
поделиться

1 ответ

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

myXML match { 
  case <a>{b @ <b>{theText}</b>}</a> => 
    println("An %s text: %s".format(b \ "@type", theText))
}
17
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: