XML узел против атрибута в Scala? - PullRequest
1 голос
/ 12 ноября 2011

Примечание: пожалуйста, скажите, что здесь синтаксис XPath мертв, спасибо.

У меня есть узел xml (на самом деле HTML), и я хотел бы получить его атрибут.

В C # (HTMLAgilityPack) я мог получить атрибут объекта по имени.Например, имея узел «а», я мог бы попросить атрибут «href».

В Scala есть метод «attribute» в xml.Node, но он возвращает последовательность из узлов .Атрибут является узлом?Как можно иметь несколько атрибутов с одним и тем же именем?Я полностью озадачен.

Более того, есть класс xml.Attribute, но я не вижу его в xml.Node.

У меня есть книга PiS, но глава XML очень мала.

Вопрос

Как мне понять, запрашивать ли атрибут для получения набора узлов?

IOW: какой смысл возвращать опцию из коллекции из узлов вместо возвращаемого атрибута?

  • опция - если атрибута нет, коллекция должна быть пустой, она удваиваетсясемантика
  • collection - это подразумевает, что возможно несколько атрибутов, поэтому мне интересно, в каком сценарии я получаю коллекцию размером> 1
  • node - атрибут - это довольно просто сущность, почему такой перебори предположить, что атрибут может иметь древовидную структуру

Ответы [ 2 ]

4 голосов
/ 12 ноября 2011

Вы просто хотите получить значение атрибута, да? В этом случае это довольно просто:

scala> val x = <foo this="xx" that="yy" />
x: scala.xml.Elem = <foo this="xx" that="yy"></foo>

scala> x.attribute("this")
res0: Option[Seq[scala.xml.Node]] = Some(xx)

scala> x.attribute("this").get.toString
res1: String = xx

Я знаю, что вы сказали, что явно не интересуетесь синтаксисом XPath, но в данном случае он действительно более аккуратен:

scala> x \ "@this"
res2: scala.xml.NodeSeq = xx

Сказав все это, вы должны знать, что существует много проблем с обработкой атрибутов во встроенной обработке XML в Scala. См., Например, это , это и это .

0 голосов
/ 13 ноября 2011

Я понимаю, что последующий ответ Пола в значительной степени охватывает ваш вопрос, но я просто хотел бы добавить еще несколько моментов:

  1. Мне лично не нравится дизайн Scala XML, чтобыВ той степени, в которой я написал альтернативную библиотеку Scales Xml , но я бы не назвал ее плохо спроектированной.Его элементы дизайна, по-видимому, также достаточно хороши, чтобы сформировать основу подхода Anti-Xml (элементы, владеющие их дочерними элементами, концепция группирования узлов и т. Д.), Но есть много причуд - атрибут и текст в виде контейнеров являются большими.
  2. Я только недавно добавил ось-потомок в Scales - ее жадная природа работает не так, как «потомок-или-сам» - согласно спецификации // para 1 не означает то же самое, что и путь местоположения/ потомок :: para 1
  3. Я не уверен, что вы можете отнести плохой дизайн к 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-кодом напрямую).

...