ScalaXML和空行

时间:2015-03-09 13:24:14

标签: xml scala whitespace implicit-conversion removing-whitespace

我刚开始使用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表示之间的转换,我很乐意听取建议:)

1 个答案:

答案 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对象。