4

遗憾的是,我需要生成一些混乱的 XML。

主文档必须包含嵌入的 XML 文档。但是,嵌入文档出现在 CDATA 部分中。最终结果应如下所示:

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

我遇到了两个问题:

首先,在 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 回答