我使用 scala.xml.PrettyPrinter 在 Scala 中格式化我的 XML。问题在于没有文本内容的节点。而不是这个:
<node></node>
我更喜欢这个:
<node />
我怎样才能让 PrettyPrinter 以我的方式格式化它?
我使用 scala.xml.PrettyPrinter 在 Scala 中格式化我的 XML。问题在于没有文本内容的节点。而不是这个:
<node></node>
我更喜欢这个:
<node />
我怎样才能让 PrettyPrinter 以我的方式格式化它?
这是 scala-xml 中的一个错误,但在 2018 年 2 月 20 日的 1.1.0 版中已修复。一个新的选项minimizeEmpty
被添加到PrettyPrinter
。
要使用 1.1.0,请将以下内容添加到您的build.sbt
:
libraryDependencies ++= Seq(
"org.scala-lang.modules" %% "scala-xml" % "1.1.0"
)
以下是如何使用新选项的示例PrettyPrinter
:
val pp = new xml.PrettyPrinter(80, 2, minimizeEmpty = true)
val x = <node><leaf></leaf></node>
println(pp.format(x))
这将输出:
<node>
<leaf/>
</node>
如果 Scala 编译器,抱怨:
java.lang.NoSuchMethodError: scala.xml.PrettyPrinter.<init>(IIZ)V
那么你需要在 sbt 中启用一个分叉的 JVM,以便 Scala 使用新版本的 scala-xml。只需将以下内容添加到您的build.sbt
:
fork := true
在 scala-xml 1.1.0 之前,创建<node/>
,的方法leafTag()
在类中,但未使用。你可以像这样修复它:
import xml._
val p2 = new PrettyPrinter(120, 2) {
override protected def traverse(node:Node, pscope:NamespaceBinding, ind:Int) =
node match {
case n:Elem if n.child.size == 0 => makeBox(ind, leafTag(n))
case _ => super.traverse(node, pscope, ind)
}
}
如果您可以升级到 1.1.0,则没有理由使用 override-hack。