私は scala.xml.PrettyPrinter を使用して XML を Scala でフォーマットします。問題は、テキスト コンテンツのないノードにあります。これの代わりに:
<node></node>
私はこれを好むだろう:
<node />
PrettyPrinter を自分のやり方でフォーマットするにはどうすればよいですか?
私は scala.xml.PrettyPrinter を使用して XML を Scala でフォーマットします。問題は、テキスト コンテンツのないノードにあります。これの代わりに:
<node></node>
私はこれを好むだろう:
<node />
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"
)
で新しいオプションを使用する方法の例を次に示します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 にアップグレードできるのであれば、オーバーライド ハックを使用する理由はありません。