scala.xml.PrettyPrinter для форматирования более короткого узла, когда в нем нет текста - PullRequest
3 голосов
/ 18 мая 2011

Я использую scala.xml.PrettyPrinter для форматирования моего XML в Scala. Проблема с узлами без текстового содержимого. Вместо этого:

<node></node>

Я бы предпочел иметь это:

<node />

Как мне сделать PrettyPrinter для его форматирования?

1 Ответ

7 голосов
/ 18 мая 2011

Это ошибка в scala-xml, но она была исправлена ​​в версии 1.1.0 20 февраля 2008 года. Новая опция 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

тогда вам нужно включить раздвоенную JVM в sbt, чтобы 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.

...