如何根据选项添加XML属性?

Dav*_*vid 13 xml scala

我编写了一个makeMsg函数,但我不喜欢它 - 它看起来真的非Scala-ish基于Option.isDefined进行区分.你能做得更好吗?

scala> def makeMsg(t: Option[String]) = 
     | if (t.isDefined) <msg text={t.get} /> else <msg />
makeMsg: (t: Option[String])scala.xml.Elem

scala> makeMsg(Some("hello"))
res0: scala.xml.Elem = <msg text="hello"></msg>

scala> makeMsg(None)
res1: scala.xml.Elem = <msg></msg>
Run Code Online (Sandbox Code Playgroud)

ten*_*shi 15

你可以试试这个:

def makeMsg(t: Option[String]) = <msg text={t orNull} />
Run Code Online (Sandbox Code Playgroud)

如果属性值是null- 它将不会添加到元素.

更新

更好!如果您要添加此隐式转换:

import xml.Text
implicit def optStrToOptText(opt: Option[String]) = opt map Text
Run Code Online (Sandbox Code Playgroud)

你可以t像这样使用:

def makeMsg(t: Option[String]) = <msg text={t} />
Run Code Online (Sandbox Code Playgroud)

这是REPL会话:

scala> import xml.Text
import xml.Text

scala> implicit def optStrToOptText(opt: Option[String]) = opt map Text
optStrToOptText: (opt: Option[String])Option[scala.xml.Text]

scala> def makeMsg(t: Option[String]) = <msg text={t} />
makeMsg: (t: Option[String])scala.xml.Elem

scala> makeMsg(Some("hello"))
res1: scala.xml.Elem = <msg text="hello"></msg>

scala> makeMsg(None)
res2: scala.xml.Elem = <msg ></msg>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为scala.xml.UnprefixedAttribute具有Option[Seq[Node]]作为值接受的构造函数.

  • 当然,直接执行此操作非常简单,隐式只是添加了样板?`def makeMsg(t:Option [String])= <msg text = {t map Text} />`.它也感觉更安全,风险更小,你会被一个意想不到的暗示所挫伤. (4认同)