4

残念ながら、厄介な XML を生成する必要があります。

メイン ドキュメントには、埋め込まれた XML ドキュメントが含まれている必要があります。ただし、埋め込まれたドキュメントは CDATA セクション内にあります。最終結果は次のようになります。

<?xml version="1.0"?>
<foo>
  <xml>
    <![CDATA[
      <?xml version="1.0" encoding="UTF-8"?>
      <bar>
      </bar>
    ]]>
  </xml>
</foo>

私は2つの問題に直面しています:

まず、CDATA セクション内で出力されるものはすべて、エスケープされたものとしてレンダリングされます (たとえば、大なり記号>は になります&gt;) 。

CDATA セクション内でエスケープを無効にする方法はありますか?

次に、XML 宣言を作成できません。埋め込まれた XML ドキュメントを含めようとすると、次の例外が発生します。

def serializeEmbedded(): Seq[Node] = {
  <?xml version="1.0"?>
  <bar>
  </bar>
}

Exception in thread "main" java.lang.IllegalArgumentException: xml is reserved
    at scala.xml.ProcInstr.<init>(ProcInstr.scala:25)

これは、Scala のネイティブ XML 処理への私の最初の進出です。

ありがとうございました、

サイシュ

4

1 に答える 1

5

XML 宣言はシリアライゼーションにのみ関連し、Scala の XML リテラル構文を使用して指定することはできません (ご存じのとおり)。

次のようなヘルパー関数を定義することをお勧めします。

import scala.xml._

def toCData(doc: Elem) = {
  val w = new java.io.StringWriter
  XML.write(w, doc, "UTF-8", true, null)
  PCData(w.toString)
}

たとえば、次のように記述できます。

scala> val doc = <outer>{ toCData(<inner/>) }</outer>
doc: scala.xml.Elem = 
<outer><![CDATA[<?xml version='1.0' encoding='UTF-8'?>
<inner></inner>]]></outer>

もう少し言語サポートがあればできるほどエレガントではありませんが、機能します。

于 2012-09-04T20:20:16.947 に答える