【发布时间】:2014-09-24 13:57:07
【问题描述】:
我正在尝试从 xml 文档中检索 cdata 部分,xml 的格式是这样的:
<Configuration>
<ConfigItem>
<Key>Hello World</Key>
<Value><![CDATA[For the value we have a large chunk of XAML stored in a CDATA section]]></Value>
</ConfigItem>
</Configuration>
我要做的是从 CDATA 部分检索 XAML,到目前为止我的代码如下:
XmlDocument document = new XmlDocument();
document.Load("Configuration.xml");
XmlCDataSection cDataNode = (XmlCDataSection) document.SelectSingleNode("//*[local-name()='Value']").ChildNodes[0];
String cdata = cDataNode.Data;
但是cdata字符串已经被截断并且不完整,我猜是因为实际的cdata太大而无法放入字符串对象中。
这样做的正确方法是什么?
编辑:
所以我最初认为字符串太长的假设是不正确的。现在的问题是我的 CDATA 中包含一个嵌套的 CDATA。在线阅读似乎逃脱嵌套cdata的正确方法是使用此xml正在使用的]]]]><![CDATA[>,但似乎当我选择节点时它在错误的地方转义。
【问题讨论】:
-
CDATA 部分有多大?
-
就字符而言是 3186923
-
.NET 字符串的理论限制约为 1GB(2B unicode 字符),实际可能更少。事实上,.NET 中的任何对象都不能大于 2GB,即使在 64 位机器上也是如此。您最多可以使用流,然后即时读取和处理数据,而无需在内存中创建那个巨大的单个对象。但首先看到这么大的 XML 文件会让我感到惊讶。 (编辑) 我没有看到你的评论,但显然 3MB 可以放在一个字符串中。
-
查看
XmlDocument的MSIL,我看不到它曾经检查或截断CDATA 长度。节点的确切长度是多少?您可以使用 pastebin 或类似的东西来粘贴示例,看看会发生什么。 -
@Groo 借调。将 XML 添加到 pastebin