将xml / CDATA嵌套到xml文件中?

时间:2011-11-14 15:28:59

标签: xml cdata

我需要将一个相当大的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格式是不是以这种方式使用?

5 个答案:

答案 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编码,则编码结果将不包含任何可能被解释为标记或实体引用的字符,并且可以安全地保存为文本节点的内容。