在XML中包装任意XML

时间:2009-04-22 13:50:41

标签: xml xml-serialization

我需要在包装器XML文档中嵌入任意(语法上有效)的XML文档。嵌入的文档只被视为文本,解析包装文档时不需要解析。

我知道“CDATA trick”,但如果内部XML文档本身包含CDATA段,我就不能使用它,我需要能够嵌入任何 XML文档。任何有关实现这一目标的建议 - 或解决CDATA限制 - 都将受到赞赏。

6 个答案:

答案 0 :(得分:5)

您可以通过简单地将文档(没有&lt; ?xml声明)添加为某个父级的子级来完成此操作。 SOAP正在这样做 - 它有一个<Body>元素,可以包含要发送的任何xml消息。

SOAP以这种方式定义XSD:

<xs:element name="Body" type="tns:Body" />
  <xs:complexType name="Body">
    <xs:sequence>
      <xs:any namespace="##any" minOccurs="0" 
          maxOccurs="unbounded" processContents="lax" />
    </xs:sequence>
    <xs:anyAttribute namespace="##any" processContents="lax">
    </xs:anyAttribute>
  </xs:complexType>

答案 1 :(得分:4)

您需要正确地转义文本。您没有说出您正在使用的语言,但通常是:您构建DOM,创建包含“内部”XML的Text节点,然后序列化该DOM。序列化程序将为您处理转义。

这里的关键点是使用序列化程序来生成输出。不要简单地编写字符串,因为你几乎可以保证产生一些格式不正确的XML。

答案 2 :(得分:2)

当您转义内部CDATA的结束角括号时,大多数XML解析器都不会抱怨XML的格式良好。使用此“变通方法”,您应该能够嵌套多个CDATA部分。

类似的东西:

<?xml version="1.0"?>
<SomeData>
<![CDATA[
<SomeMoreData>
<![CDATA[
yeah, this trick rocks! ...
]]&gt;
</SomeMoreData>
]]>
</SomeData>

请注意,内部CDATA的结尾为“&gt;”转义为&gt;

答案 3 :(得分:1)

考虑使用XInclude而不是尝试将XML文档嵌入到另一个文档中。 XInclude parse =“text”属性将强制将XML视为文本,而不是标记。

答案 4 :(得分:1)

一个简单的解决方案是您可以拥有相邻的CDATA部分。 <![CDATA[A]]><![CDATA[B]]><![CDATA[AB]]>相同。因此,您可以将<![CDATA[]]]]><![CDATA[>]]>]]>关闭标记拆分为两个CDATA部分。

答案 5 :(得分:0)

这不是character entities的用途吗?