我需要将大约 2gb 的大型 xml 文件转换为 csv。因此,我会遇到内存不足异常,因为 xmldocument() 无法将整个文件加载到内存中。我曾尝试使用 xml 阅读器,但我不确定如何在没有 xml 的 dtd 的情况下进行操作
我在 c# 中有我的代码
你为什么不能这样做http://danbarnett.net/how-to-convert-large-xml-files-to-csv-78.html 或使用 vtd-xml http://vtd-xml.sourceforge.net /
使用 vtd-xml 对您来说应该相当简单
使用 XmlReader 时默认禁用 DTD 处理。与基本 StreamWriter 关联的 XmlReader 对我们来说是高效的,因为我们处理的文件大约为 200 mb 大。
使用 XmlReader 类解析 xml 的 Microsoft 开发人员只需将以下两行添加到他们的代码中,以防止 XmlReader 访问 DTD 声明中引用的 URI:
settings.ProhibitDtd = false;
settings.XmlResolver = null;
其中 settings 是 XmlReaderSettings 类的一个实例。为 ProhibitDtd 分配一个 false 值将防止 XmlReader 在遇到 DTD 引用时抛出异常,而将其设置为 true 将导致读取器中止进一步的解析。将 XmlResolver 设置为 null 会导致阅读器忽略外部引用的 DTD。这允许读者在不访问外部引用的 DTD 的情况下解析整个 xml 文档。
引自:http: //xponentsoftware.com/articles/Http_overload.aspx
此外,OP 表示 dtd 文件不可用。在这种情况下,将 ProhibitDtd 设置为 false 是不够的,因为如果找不到 dtd 文件,则会引发异常。将 XmlResolver 设置为 null 可以解决该问题。
如果您在 64 位上运行并希望快速修复 OutOfMemoryException:转到您的项目属性 -> 构建选项卡 -> 平台目标:将“任何 CPU”更改为“x64”。
您将能够在 Xdocument 中加载 2GB XML 文件。