3

私は scala.xml.PrettyPrinter を使用して XML を Scala でフォーマットします。問題は、テキスト コンテンツのないノードにあります。これの代わりに:

<node></node>

私はこれを好むだろう:

<node />

PrettyPrinter を自分のやり方でフォーマットするにはどうすればよいですか?

4

1 に答える 1

7

これは 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

次に、Scala が新しいバージョンの scala-xml を使用するように、sbt でフォークされた JVM を有効にする必要があります。に以下を追加するだけ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 にアップグレードできるのであれば、オーバーライド ハックを使用する理由はありません。

于 2011-05-18T15:53:28.410 に答える