2011-01-07 13 views
7

Wygląda na to, że wartości atrybutów są typu Seq[Node].Scala XML API: Dlaczego zezwolić na NodeSeq jako wartości atrybutów?

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

Oznacza to, że można przypisać kod XML jako wartość atrybutu.

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> 

Wydaje mi się to zabawne. Nigdy nie widziałem XML jako wartości atrybutów w prawdziwym świecie. Dlaczego jest dozwolone? Dlaczego wartość atrybutu nie jest po prostu typu String?

Odpowiedz

4

Z scala.xml "draft" book Burak Emir:

rozpocząć cytat

Na pierwszy rzut oka wydaje się, że atrybuty powinny być tylko ciągi i nic więcej. Istnieją jednak dwa powody, aby zezwolić na ten sam rodzaj węzłów (innych niż węzły elementów), które mogą pojawiać się w XML: wartości danych i odwołania do encji.

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

Koniec cytatu

Teraz Próbowałem że w 2.8.0 i nie dość skompilować - muszę korzystać new Atom(42). Ale mogę wpisać coś takiego:

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

To było częścią racjonalnego uzasadnienia wykorzystania węzłów dla atrybutów. I tak, to trochę funky.

Powiązane problemy