2016-04-15 62 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中的属性。 –