如何在XML中嵌入XML

13

我需要在另一个xml文档中嵌入一个完整的格式良好的xml文档。然而,我宁愿避免使用CDATA(个人不喜欢),同时我也想避免解析器浪费时间解析嵌入式xml。 嵌入的xml可能相当重要,我希望接收整个文件的代码将嵌入的xml视为任意数据。

我马上想到的主意是使用base64对嵌入式xml进行编码,或者对其进行压缩。这个主意听起来可以吗?

顺便说一下,我正在使用C#进行编码。


2
这与嵌入式软件无关,因此不应将其标记为嵌入式软件。 - uɐɪ
9个回答

5
您可以将XML转换为字节数组,然后将其转换为binary64格式。这样可以让您将其嵌套在元素中,而不必使用CDATA标记。

4

根据您构建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;

输出结果将类似于一个HTML编码的字符串:
<?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
我发布的链接是一个用C#实现的.Net XInclude。 - Dour High Arch

3

简要说明一下,我已经采用了base64的方法,并且它运行良好,但是在高负载情况下会有明显的性能损失。我们使用文档片段达到20MB,经过base64编码后,它们可能需要超过65MB(包括标记和数据),即使进行了压缩。

然而,更大的问题是,在执行编码/解码时,.NET base64编码可能会消耗多达10倍的内存,如果重复执行和/或在多个线程上执行,可能会频繁引发OOM异常。

有人在类似的问题上推荐ProtoBuf作为一个选择,以及Fast InfoSet作为另一个选择。


由于我想嵌入的数据是XML格式的,因此它具有高度可压缩性。经过一些测试,似乎如果我在将XML转换为base64之前先对其进行压缩,则最终字节大小比原始未压缩的XML占用的数据量少约10%。我认为我会选择这种方式! - tempy
谢谢你的链接,@Jimmy Zhang。 - GrayWizardx

1

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


1
如果您不需要XML声明(文档的第一行),只需将根元素(及其所有子元素)作为现有元素的子元素插入到其他XML文档的树中。使用不同的命名空间来区分插入的元素。

1
这仍然会导致接收端的解析器解析嵌入式XML,而我想避免这种情况。 - tempy
1
@tempy 解析器还需要解析CDATA或base64编码的数据,以检查其是否格式正确并将其作为字符数据传递给应用程序。您需要进行基准测试,以确定放弃结构的成本是高于还是低于解析base64中的额外字节。 - Pete Kirkham
@Pete Kirkham 这是一个很好的观点...我需要进行调查。 - tempy

0

0

你不能用XSLT来做这个吗?也许可以使用xsl:copy或者xsl:copy-of?这是XSLT的用途。


-1

我使用注释来实现这个功能:

<!-- 你的 XML 文本 -->

[已编辑]
如果嵌入的 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>

1
如果嵌入的XML中也有注释,那该怎么办?它不会取消注释其余部分吗? - Petr Peller
这不是我的情况,我知道我输入的内容。 - lsalamon
1
这对我来说有点太像黑客手段了。清除注释的内部XML需要将其视为一个潜在的巨大字符串进行处理,这可能相当昂贵,并且我认为可以通过使用其他方法来避免这种情况。 - tempy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接