scala.xml.PrettyPrinter 在其中没有文本时格式化较短的节点

发布于 2024-11-07 20:18:37 字数 218 浏览 0 评论 0原文

我使用 scala.xml.PrettyPrinter 在 Scala 中格式化 XML。问题在于没有文本内容的节点。而不是这个:

<node></node>

我更喜欢这个:

<node />

如何让 PrettyPrinter 按照我的方式格式化?

I use scala.xml.PrettyPrinter to format my XML in Scala. The problem is with nodes without text content. Instead of this:

<node></node>

I'd prefer to have this:

<node />

How can I make PrettyPrinter to format it my way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

简单 2024-11-14 20:18:37

这是 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 之前,创建 的方法、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。

This was a bug in scala-xml, but it was fixed in version 1.1.0 on Feb-20-2018. A new option minimizeEmpty was added to PrettyPrinter.

To use 1.1.0, add the following to your build.sbt:

libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-xml" % "1.1.0"
)

Here's an example of how to make use of the new option in PrettyPrinter:

val pp = new xml.PrettyPrinter(80, 2, minimizeEmpty = true)
val x = <node><leaf></leaf></node>
println(pp.format(x))

This will output:

<node>
  <leaf/>
</node>

If the Scala compiler, complains:

java.lang.NoSuchMethodError: scala.xml.PrettyPrinter.<init>(IIZ)V

then you need to enable a forked JVM in sbt, so that Scala is using the new version of scala-xml. Just add the follow to your build.sbt:

fork := true

Previous to scala-xml 1.1.0, the method to create <node/>, leafTag(), is in the class, but unused. You can fix it like so:

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)
    }
}

There's no reason to use the override-hack if you can just upgrade to 1.1.0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文