2016-04-15 61 views
3

如何避免屬性竄進具有XML節點無類型:斯卡拉XML null檢查屬性

我想下面的代碼,但它不工作:

scala> val checked:Option[String] = None 
checked: Option[String] = None 

scala> val xml = <input checked={checked} /> 
<console>:11: 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 (String, Option[String], scala.xml.MetaData) 
    val xml = <input checked={checked} /> 

預期的輸出是這樣的:

xml: scala.xml.Elem = <input/> 

如果檢查的類型是xml.Text,那麼它的工作。所以基本上我想有條件地插入屬性,如果value是Some(type),那麼包含屬性如果它的None然後忽略,它怎麼可能與Xml.Text以外的屬性類型?

回答

1

有錯誤的Option[String]類型您應該使用Option[scala.xml.Text]來代替。例如,如果你有Option[String]你可以map它:

val xml = <input checked={checked.map(scala.xml.Text.apply)}/>

,或者您可以使用

val xml = <input checked={checked.orNull}/>

但我認爲這是一個有點醜陋null工作。

+0

這個scala.xml.Text.apply適用於所有數據類型,包括Integers/BigDecimal/DateTime嗎? – user1079341

+0

在字符串類型上使用映射時出現此錯誤: 類型不匹配:expected(char)=> NotInfferedB actual:(String)=>文本 – user1079341

+0

如果我理解我們正在討論'Option [String]'而不僅僅是'String',所以地圖會清晰地工作。關於另一個類型,例如'Int',你可以用'scala.xml.Atom'映射它。對於實例'val xml = '還有一點,這也可以在Option [String]中使用。 –

0
<input checked = {checked.getOrElse(null)} /> 

>> xml: scala.xml.Elem = <input/> 

將屬性設置爲null與沒有屬性相同。

+0

但在Scala中應該避免使用null。 – user1079341

+0

有些情況下可以。這是其中之一。 XML解析器正確地將null解釋爲表示不應包含在XML中的屬性。 –