2011-01-07 12 views
7

Parece que los valores de los atributos son del tipo Seq[Node].API Scala XML: ¿Por qué permitir NodeSeq como valores de atributo?

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

Esto significa que puede asignar XML como valor de atributo.

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> 

Esto me parece funky. Nunca he visto XML como valores de atributo en el mundo real. ¿Por qué está permitido? ¿Por qué un valor de atributo simplemente no es del tipo String?

Respuesta

4

Desde el scala.xml "draft" book por Burak Emir:

comienzan cita

A primera vista, parece que los atributos sólo deben ser cadenas y nada más. Sin embargo, hay dos razones para permitir el mismo tipo de nodos (distintos a los nodos de elementos) que pueden aparecer dentro de XML: valores de datos y referencias de entidad.

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

fin de la cita

Ahora he intentado que en 2.8.0 y no acaba de compilar - Necesito usar new Atom(42). Pero puedo escribir algo como esto:

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

Así que eso era parte de la justificación para el aprovechamiento de los nodos de atributos. Y sí, es un poco raro.

Cuestiones relacionadas