加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala在PCDATA中嵌入了嵌套的XML文档

发布时间:2020-12-16 10:03:32 所属栏目:安全 来源:网络整理
导读:我遗憾地要求生成一些凌乱的 XML. 主文档必须包含嵌入的XML文档.但是,嵌入文档出现在CDATA部分中.最终结果应如下所示: ?xml version="1.0"?foo xml ![CDATA[ ?xml version="1.0" encoding="UTF-8"? bar /bar ]] /xml/foo 我遇到两个问题: 首先,在CDATA部分
我遗憾地要求生成一些凌乱的 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处理.

谢谢,

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)
}

现在你可以写,例如:

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

它不像在语言支持方面那样优雅,但它有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读