我遗憾地要求生成一些凌乱的XML.
主文档必须包含嵌入的XML文档.但是,嵌入文档出现在CDATA部分中.最终结果应如下所示:
<?xml version="1.0"?>
<foo>
<xml>
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<bar>
</bar>
]]>
</xml>
</foo>
Run Code Online (Sandbox Code Playgroud)
我遇到两个问题:
首先,在CDATA部分中输出的任何内容都呈现为转义(例如,大于符号>变为>)
有没有办法禁用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)
Run Code Online (Sandbox Code Playgroud)
这是我第一次涉足Scala的原生XML处理.
谢谢,
Saish
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)
}
Run Code Online (Sandbox Code Playgroud)
现在你可以写,例如:
scala> val doc = <outer>{ toCData(<inner/>) }</outer>
doc: scala.xml.Elem =
<outer><![CDATA[<?xml version='1.0' encoding='UTF-8'?>
<inner></inner>]]></outer>
Run Code Online (Sandbox Code Playgroud)
它不像在语言支持方面那样优雅,但它有效.