amo*_*fis 3 xml formatting scala scala-xml
我使用scala.xml.PrettyPrinter在Scala中格式化我的XML.问题在于没有文本内容的节点.而不是这个:
<node></node>
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个:
<node />
Run Code Online (Sandbox Code Playgroud)
我怎样才能让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"
)
Run Code Online (Sandbox Code Playgroud)
以下是如何使用新选项的示例PrettyPrinter
:
val pp = new xml.PrettyPrinter(80, 2, minimizeEmpty = true)
val x = <node><leaf></leaf></node>
println(pp.format(x))
Run Code Online (Sandbox Code Playgroud)
这将输出:
<node>
<leaf/>
</node>
Run Code Online (Sandbox Code Playgroud)
如果Scala编译器抱怨:
java.lang.NoSuchMethodError: scala.xml.PrettyPrinter.<init>(IIZ)V
Run Code Online (Sandbox Code Playgroud)
那么你需要在sbt中启用一个分叉的JVM,以便Scala使用新版本的scala-xml.只需将以下内容添加到您的build.sbt
:
fork := true
Run Code Online (Sandbox Code Playgroud)
上一页到斯卡拉的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)
}
}
Run Code Online (Sandbox Code Playgroud)
如果你可以升级到1.1.0,没有理由使用override-hack.
归档时间: |
|
查看次数: |
407 次 |
最近记录: |