我需要在包装器XML文档中嵌入任意(语法上有效)的XML文档。嵌入的文档只被视为文本,解析包装文档时不需要解析。
我知道“CDATA trick”,但如果内部XML文档本身包含CDATA段,我就不能使用它,我需要能够嵌入任何 XML文档。任何有关实现这一目标的建议 - 或解决CDATA限制 - 都将受到赞赏。
答案 0 :(得分:5)
您可以通过简单地将文档(没有< ?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! ...
]]>
</SomeMoreData>
]]>
</SomeData>
请注意,内部CDATA的结尾为“&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的用途吗?