我有一个大于 100mb 的大 XML 文件,我想检查这个文件的结构是否有效。
我可以尝试用DOMDocument
;加载这个文件 例如,我可以使用 PHP XML 解析器来阅读它,它“让您解析但不验证 XML 文档”。
有没有办法在不将 XML 文件完全加载到内存中的情况下做到这一点?
我有一个大于 100mb 的大 XML 文件,我想检查这个文件的结构是否有效。
我可以尝试用DOMDocument
;加载这个文件 例如,我可以使用 PHP XML 解析器来阅读它,它“让您解析但不验证 XML 文档”。
有没有办法在不将 XML 文件完全加载到内存中的情况下做到这一点?
首先,您没有说您使用哪种模式进行验证:DTD、XSD、RelaxNG?
其次,您提到了 PHP,但您没有说解决方案是否必须基于 PHP。例如,您可以使用 Java 吗?
一般来说,根据模式验证 XML 文档是一种可流式操作,它不需要在内存中构建 XML 文档的树表示。找到在您的环境中工作的流式验证器应该不难,但我们需要知道环境是什么(以及您使用的模式语言)。
我认为您需要查看XMLReader类。更具体地说, XMLReader::setSchema。
想想你在说什么。您想对不在内存中的数据进行操作。这根本没有意义......如果你想从操作中引用它,它最终必须在内存中。
如果您不想一次将数据全部加载到内存中,则可以采用分而治之的方法。如果文件非常大,您可以在多个进程中运行 map reduce 作业,但这不会减少使用的内存量。
如果您只想检查 XML 结构是否有效,您可以使用 PHP 的 XML Parser。它不会根据 DTD 验证文档,这就是它不会验证的意思。
如果在解析 XML 结构时发现其无效,则可以返回所有这些错误代码。