Scala XML API: зачем разрешать NodeSeq в качестве значений атрибутов? - PullRequest
7 голосов
/ 07 января 2011

Кажется, значения атрибутов имеют тип Seq[Node].

scala> <a b="1"/>.attribute("b")             
res11: Option[Seq[scala.xml.Node]] = Some(1)

Это означает, что вы можете назначить XML в качестве значения атрибута.

scala> <a b={<z><x/></z>}/>.attribute("b")            
res16: Option[Seq[scala.xml.Node]] = Some(<z><x></x></z>)

scala> <a b={<z><x/></z>}/>.attribute("b").map(_ \ "x")
res17: Option[scala.xml.NodeSeq] = Some(<x></x>)

scala> new xml.PrettyPrinter(120, 2).format(<a b={<z><x/></z>}/>)
res19: String = <a b="<z><x></x></z>"></a>

Это кажется мне забавным.Я никогда не видел XML как значения атрибутов в реальном мире.Почему это разрешено?Почему значение атрибута просто не относится к типу String?

1 Ответ

4 голосов
/ 07 января 2011

Из scala.xml "черновой" книги Бурака Эмира:

начало цитаты

На первый взглядПохоже, что атрибуты должны быть только строками и ничего больше.Однако есть две причины разрешить узлы одного типа (отличные от узлов элементов), которые могут появляться в XML: значения данных и ссылки на сущности.

<foo name= "s&uuml;ss" life={Atom(42)}>

конечная кавычка

Теперь я попробовал это в 2.8.0, и он не совсем компилируется - мне нужно использовать new Atom(42).Но я могу напечатать что-то вроде этого:

<foo name={List(Text("s"), EntityRef("uuml"), Text("ss"))}/> 

Так что это было частью обоснования для использования узлов для атрибутов.И да, это немного в стиле фанк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...