Я понимаю, что последующий ответ Пола в значительной степени охватывает ваш вопрос, но я просто хотел бы добавить еще несколько моментов:
- Мне лично не нравится дизайн Scala XML, чтобыВ той степени, в которой я написал альтернативную библиотеку Scales Xml , но я бы не назвал ее плохо спроектированной.Его элементы дизайна, по-видимому, также достаточно хороши, чтобы сформировать основу подхода Anti-Xml (элементы, владеющие их дочерними элементами, концепция группирования узлов и т. Д.), Но есть много причуд - атрибут и текст в виде контейнеров являются большими.
- Я только недавно добавил ось-потомок в Scales - ее жадная природа работает не так, как «потомок-или-сам» - согласно спецификации // para 1 не означает то же самое, что и путь местоположения/ потомок :: para 1
- Я не уверен, что вы можете отнести плохой дизайн к Anti-Xml либо из-за его отсутствия, это молодой проект (чуть более семи месяцев?) ивозможно, они просто еще не дошли до добавления потомка.
Прямой ответ на вопрос об атрибутах для Scales:
val pre = Namespace("uri:test").prefixed("pre")
val elem = Elem("fred"l, emptyAttributes +
("attr", "value") +
Attribute(pre("attr"), "value"))
println("attributes are a map " + elem.attributes("attr"))
println("attributes are a set " + (
elem.attributes + ("attr", "new value")))
val xpath = top(elem) \@ pre("attr")
xpath foreach{ap => println(ap.name)}
, дающий
[info] attributes are a map Some(Attribute({}attr,value))
[info] attributes are a set ListSet(Attribute({}attr,new value), Attribute({uri:test}attr,value))
[info] {uri:test}attr
Синтаксис XPath должен возвращать коллекцию, поскольку это может быть любое количество путей, которые достигли соответствующего атрибута.Сами атрибуты элемента соответствуют атрибуту QName «attr», что означает отсутствие пространства имен и localName атрибута.Для дополнительного здравого смысла атрибут QName имеет вид:
type AttributeQName = EitherLike[PrefixedQName, NoNamespaceQName]
Компилятор не допускает появления локальных имен только QNames.
В качестве отступления, хотя я понимаю, почему синтаксис, подобный XML XPath для Scala,вероятно, неинтересно, вам следует взглянуть на Scales для запросов на основе XPath.
Существует как запрос на основе строк в XPath 1.0 (еще не помещен в версию без снимка), так и внутренний dsl, который позволяет компилятору / ide помогатьвас (плюс бонус за то, что вы намного быстрее и работаете с Scala-кодом напрямую).