2011-11-07 9 views
12
scala> val count = 7 
count: Int = 7 

etyk, że do atrybutu XML daje błąd:XML Creation - błąd: przeciążona metoda konstruktora UnprefixedAttribute z alternatyw

scala> val x = <element count={count}/> 
<console>:8: error: overloaded method constructor UnprefixedAttribute with alternatives: 
    (key: String,value: Option[Seq[scala.xml.Node]],next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and> 
    (key: String,value: String,next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and> 
    (key: String,value: Seq[scala.xml.Node],next1: scala.xml.MetaData)scala.xml.UnprefixedAttribute 
cannot be applied to (java.lang.String, Int, scala.xml.MetaData) 
     val x = <element count={count}/> 

Odpowiedz

23

Wejścia do atrybutów XML musi być łańcuchami. Liczby całkowite i obiekty nie zostaną automatycznie przekonwertowane na ciągi znaków przy użyciu ich metody toString. Na przykład, jeśli zdefiniowano klasy wielkości za pomocą jednostek ENUM:

scala> object Units extends Enumeration { 
    | type Units = Value 
    | val COUNT = Value("count") 
    | val LB = Value("pounds") 
    | val OZ = Value("ounces") 
    | val GRAM = Value("grams") 
    | val KG = Value("kilograms") 
    | val GAL = Value("gallons") 
    | val QT = Value("quarts") 
    | val PINT = Value("pints") 
    | val FL_OZ = Value("fluid ounces") 
    | val L = Value("liters") 
    | } 
defined module Units 


scala> class Size(val value: Double, val unit: Units.Units) { 
    | override def toString = value + " " + unit.toString 
    | } 
defined class Size 

stworzył instancję Rozmiar:

scala> val seven = new Size(7, Units.COUNT) 
seven: Size = 7.0 count 

następnie próbowali umieścić swój rozmiar do atrybutu XML, byś nadal uzyskać błąd:

scala> val x = <element size={seven}/> 
<console>:10: error: overloaded method constructor UnprefixedAttribute with alternatives: 
    (key: String,value: Option[Seq[scala.xml.Node]],next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and> 
    (key: String,value: String,next: scala.xml.MetaData)scala.xml.UnprefixedAttribute <and> 
    (key: String,value: Seq[scala.xml.Node],next1: scala.xml.MetaData)scala.xml.UnprefixedAttribute 
cannot be applied to (java.lang.String, Size, scala.xml.MetaData) 
     val x = <element size={seven}/> 
       ^

Musisz jawnie wywołać metodę toString. To działa:

scala> val x = <element count={count.toString} size={seven.toString}/> 
x: scala.xml.Elem = <element size="7.0 count" count="7"></element> 
Powiązane problemy