我需要在另一个xml文档中嵌入一个完整的格式良好的xml文档。然而,我宁愿避免使用CDATA(个人不喜欢),同时我也想避免解析器浪费时间解析嵌入式xml。 嵌入的xml可能相当重要,我希望接收整个文件的代码将嵌入的xml视为任意数据。
我马上想到的主意是使用base64对嵌入式xml进行编码,或者对其进行压缩。这个主意听起来可以吗?
顺便说一下,我正在使用C#进行编码。
我需要在另一个xml文档中嵌入一个完整的格式良好的xml文档。然而,我宁愿避免使用CDATA(个人不喜欢),同时我也想避免解析器浪费时间解析嵌入式xml。 嵌入的xml可能相当重要,我希望接收整个文件的代码将嵌入的xml视为任意数据。
我马上想到的主意是使用base64对嵌入式xml进行编码,或者对其进行压缩。这个主意听起来可以吗?
顺便说一下,我正在使用C#进行编码。
根据您构建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;
<?xml version="1.0" encoding="utf-8"?>
<helloworld><how><are><you
reply="i am fine">really</you></are></how>
</helloworld>
简要说明一下,我已经采用了base64的方法,并且它运行良好,但是在高负载情况下会有明显的性能损失。我们使用文档片段达到20MB,经过base64编码后,它们可能需要超过65MB(包括标记和数据),即使进行了压缩。
然而,更大的问题是,在执行编码/解码时,.NET base64编码可能会消耗多达10倍的内存,如果重复执行和/或在多个线程上执行,可能会频繁引发OOM异常。
有人在类似的问题上推荐ProtoBuf作为一个选择,以及Fast InfoSet作为另一个选择。
我会用你喜欢的方式进行编码(例如base64或HttpServerUtility :: UrlEncode,...),然后嵌入它。
你不能用XSLT来做这个吗?也许可以使用xsl:copy或者xsl:copy-of?这是XSLT的用途。
我使用注释来实现这个功能:
<!-- 你的 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>