如何在xml中嵌入xml

时间:2010-03-03 00:30:18

标签: c# xml xml-serialization

我需要在另一个xml文档中嵌入一个格式正确的xml文档。但是,我宁愿避免使用CDATA(个人厌恶),也希望避免因为浪费时间解析嵌入式xml而收到整个文档的解析器。嵌入式xml可能非常重要,我希望接收整个文件的代码将嵌入式xml视为任意数据。

立即想到的想法是在base64中编码嵌入式xml,或者压缩它。听起来不错吗?

顺便说一下,我在C#编码。

9 个答案:

答案 0 :(得分:5)

您可以将XML转换为字节数组,然后将其转换为binary64格式。这将允许您将其嵌套在一个元素中,而不必使用CDATA。

答案 1 :(得分:4)

W3C批准的方式是XInclude。在。http://mvp-xml.sourceforge.net/xinclude/

有.Net的实现

答案 2 :(得分:3)

只是一个快速的说明,我已经走了base64路线并且它工作得很好但它确实带来了严重的性能损失,特别是在大量使用的情况下。我们这样做的文档片段高达20MB,在base64编码后,它们可以占用65MB(带标签和数据),即使是压缩。

然而,更大的问题是.NET base64编码在执行编码/解码时可能会消耗高达10倍的内存,并且如果在多个线程上重复和/或完成,可能经常导致OOM异常。

有人在类似问题上建议ProtoBuf作为选项,并Fast InfoSet作为另一种选择。

答案 3 :(得分:3)

根据您构建XML的方式,一种方法是不关心它,让框架处理它。

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?><helloworld></helloworld>");
string xml = "<how><are><you reply=\"i am fine\">really</you></are></how>";
doc.GetElementsByTagName("helloworld")[0].InnerText = xml;

输出类似于HTMLEncoded字符串:

<?xml version="1.0" encoding="utf-8"?>
<helloworld>&lt;how&gt;&lt;are&gt;&lt;you
  reply="i am fine"&gt;really&lt;/you&gt;&lt;/are&gt;&lt;/how&gt;
</helloworld>

答案 4 :(得分:1)

我会用你最喜欢的方式对它进行编码(例如base64或HttpServerUtility :: UrlEncode,...)然后嵌入它。

答案 5 :(得分:1)

如果您不需要xml声明(文档的第一行),只需将根元素(包含所有子元素)作为现有元素的子元素插入到另一个xml文档的树中。使用不同的命名空间来分隔插入的元素。

答案 6 :(得分:0)

似乎serialization是推荐的方法。

答案 7 :(得分:0)

你不能使用XSLT吗?也许使用xsl:copy或xsl:copy-of?这就是XSLT的用途。

答案 8 :(得分:-1)

我为此使用评论:

&lt;! - 您的xml文字 - &gt;

[EDITED]
如果嵌入的xml带有注释,请用不同的语法替换它。

<?xml version="1.0" encoding="iso-8859-1" ?>
<xml>
    <status code="0" msg="" cause="" />
    <data>
        <order type="07" user="none" attrib="..." >
        <xmlembeded >
            <!--
                <?xml version="1.0" encoding="iso-8859-1" ?>
                <xml>
                <status ret="000 "/>
                <data>
                <allxml_here />
                <!** embedeb comments **>
                </data>
                <xml>
            -->
        </xmlembeded >
        </order>
        <context sessionid="12345678" scriptname="/from/..."  attrib="..." />
    </data>
</xml>
相关问题