我刚开始使用scala
并且在将我的域对象(case class
)表示为格式良好的XML时遇到问题。我有以下隐式转换器:
implicit def identifierToXml(ident : Identifier): Elem =
<identifier>
{ if(ident.use != null) <use value={ident.use}/> }
{ if(ident.label != null) <label value={ident.label}/> }
{ if(ident.system != null) <system value={ident.system}/> }
{ if(ident.value != null) <value value={ident.value}/> }
{ if(ident.period != null) <period>{ident.period}</period> }
{ if(ident.assigner != null) <assigner>{ident.assigner}</assigner> }
</identifier>
它的效果很好,除了它在缺失值上注入空行。例如Identifier(system = "test")
导致:
<identifier>
<system value="test"/>
</identifier>
我知道我可以使用scala.xml.Utility.trim(...)
转换为完全修剪的表示形式(<identifier><system value="test"/></identifier>
),但宁愿保留格式,但空行除外。
我怎样才能以惯用的方式实现这一目标?如果我要使用scala.xml.Utility.trim(...)
,有没有一种很好的方法将它添加到我的隐式转换器中?
NB。另外,如果有更好的方法来处理object <-> xml
表示之间的转换,我很乐意听取建议:)
答案 0 :(得分:2)
问题在于,在构造XML文本时,每个新行都会转换为XML新行。如果你关心的只是查看它并将其变成一个字符串,你可以使用scala.xml.PrettyPrinter
:
val printer = new PrettyPrinter(100, 2)
printer.format(myDiv)
如果您想从该字符串中获取元素,可以使用loadString
:
XML.loadString(printer.format(myDiv))
但你可以像你说的那样使用scala.xml.Utility.trim
,然后使用PrettyPrint
打印它。如果符合您的结构,您甚至可以覆盖toString
对象。