运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

scala.xml.PrettyPrinter在没有文本的情况下格式化较短的节点

运维开发网 https://www.qedev.com 2020-07-30 19:35 出处:网络 作者:运维开发网整理
我使用 scala.xml.PrettyPrinter在 Scala中格式化我的XML.问题在于没有文本内容的节点.而不是这个: <node></node> 我更喜欢这个: <node /> 我怎样才能让PrettyPrinter按照我的方式进行格式化? 这是scala-xml中的一个错误,但是它在2018年2月20日的版本1.1.0中修复了. PrettyPrinter中添加了一个新选项mini
我使用 scala.xml.PrettyPrinter在 Scala中格式化我的XML.问题在于没有文本内容的节点.而不是这个:

<node></node>

我更喜欢这个:

<node />

我怎样才能让PrettyPrinter按照我的方式进行格式化?

这是scala-xml中的一个错误,但是它在2018年2月20日的版本1.1.0中修复了. PrettyPrinter中添加了一个新选项minimizeEmpty.

要使用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.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消