我需要将一个相当大的xml文件放入另一个xml文件中。我考虑过使用CDATA:
http://www.w3.org/TR/2000/REC-xml-20001006#sec-cdata-sect http://www.w3schools.com/xml/xml_cdata.asp
但由于我的xml可能还包含CDATA,除非我做了一些讨厌的解决方法,否则这不起作用:
http://web-design.blogs.webucator.com/2010/11/20/nesting-cdata-blocks/
是否有更好的方法来传输/编码大型嵌套xml文件,或者xml格式是不是以这种方式使用?
答案 0 :(得分:4)
你可以用]]]]><!来替换内在的]] 。[CDATA [
(基于http://web-design.blogs.webucator.com/2010/11/20/nesting-cdata-blocks/)
示例:我们有外部和内部文档,我们希望将内部作为CDATA放在外部。
<outer>
<e1 name="abc"/>
<innerDoc><![CDATA[
<Doc1/>
]]></innerDoc>
</outer>
<inner>
<innrer1/>
<a><![CDATA[
free text with << >
]]></a>
<innrer2/>
</inner>
如果我们只是复制并粘贴,我们会得到一个无效的xml
<outer>
<e1 name="abc"/>
<innerDoc><![CDATA[
<inner>
<innrer1/>
<a><![CDATA[
free text with << >
]]></a>
<innrer2/>
</inner>
]]></innerDoc>
</outer>
然而,如果我们将内部]]替换为]]]]&gt;&lt;![CDATA [在嵌入之前我们解决问题
<outer>
<e1 name="abc"/>
<innerDoc><![CDATA[
<inner>
<innrer1/>
<a><![CDATA[
free text with << >
]]]]><![CDATA[></a>
<innrer2/>
</inner>
]]></innerDoc>
</outer>
答案 1 :(得分:2)
是的,在最顶层的文档中,将数据类型为bin.base64的CDATA部分。这样,即使您正在包装的文档包含CDATA部分,您也会受到保护。作为额外的奖励,您的应用程序还将支持二进制文件(图像,电子表格等)。
以下是基于Microsoft ADO和MSXML的一些代码。
function wrapBinaryFile( strFileName)
{
var ado_stream = new ActiveXObject("ADODB.Stream");
var xml = newXMLDocument();
xml.loadXML("<file/>");
xml.documentElement.setAttribute( "name", strFileName );
xml.documentElement.setAttribute("xmlns:dt","urn:schemas-microsoft-com:datatypes");
xml.documentElement.dataType = "bin.base64";
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile( strFileName );
xml.documentElement.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
return xml;
}
如何在另一端解开它...
function unwrapBinaryFile(ndFile, strFileName )
{
var ado_stream = new ActiveXObject("ADODB.Stream");
ndFile.dataType = "bin.base64";
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.write( ndFile.nodeTypedValue );
ado_stream.SaveToFile( strFileName, 2 );
ado_stream.Close();
}
答案 2 :(得分:2)
第一个XML:
<root>
<data1 value="test1" />
<data2>
<value>test2</value>
</data2>
</root>
第二个XML:
<root2>
<data3 value="test3" />
<data4>
<value>test4</value>
</data2>
</root2>
您可以首先在特定节点中包含第二个XML:
<root>
<data1 value="test1" />
<data2>
<value>test2</value>
</data2>
<dataFromSecondXML>
<data3 value="test3" />
<data4>
<value>test4</value>
</data2>
</dataFromSecondXML>
</root>
答案 3 :(得分:1)
XML是层次结构的:为什么不能在没有CDATA的情况下直接嵌套文档?除了DTD问题之外,任何XML文档都可以作为另一个文档中元素的内容进行复制。
答案 4 :(得分:0)
简短的回答是,XML并不是以这种方式使用的!
但是,如果对要打包的XML文件进行base64编码,则编码结果将不包含任何可能被解释为标记或实体引用的字符,并且可以安全地保存为文本节点的内容。