【问题标题】:Processing large CDATA section in C#在 C# 中处理大型 CDATA 部分
【发布时间】: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正在使用的]]]]&gt;&lt;![CDATA[&gt;,但似乎当我选择节点时它在错误的地方转义。

【问题讨论】:

  • CDATA 部分有多大?
  • 就字符而言是 3186923
  • .NET 字符串的理论限制约为 1GB(2B unicode 字符),实际可能更少。事实上,.NET 中的任何对象都不能大于 2GB,即使在 64 位机器上也是如此。您最多可以使用流,然后即时读取和处理数据,而无需在内存中创建那个巨大的单个对象。但首先看到这么大的 XML 文件会让我感到惊讶。 (编辑) 我没有看到你的评论,但显然 3MB 可以放在一个字符串中。
  • 查看XmlDocument 的MSIL,我看不到它曾经检查或截断CDATA 长度。节点的确切长度是多少?您可以使用 pastebin 或类似的东西来粘贴示例,看看会发生什么。
  • @Groo 借调。将 XML 添加到 pastebin

标签: c# xml xaml xpath cdata


【解决方案1】:

当有嵌套的 CDATA 部分时,您需要做的是将数据重新组合在一起。目前,您只是选择ChildNodes[0] 并忽略所有其他孩子。您可能会发现ChildNodes[1] 包含一些纯文本,然后ChildNodes[2] 包含另一个CDATA 部分,依此类推。

您需要提取所有这些,从 CData 部分中提取数据,并将它们连接在一起以获得Value 元素的有效“文本”内容。

【讨论】:

    猜你喜欢
    • 2014-09-07
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多