验证一个巨大的 XML 文件

Posted

技术标签:

【中文标题】验证一个巨大的 XML 文件【英文标题】:Validating a HUGE XML file 【发布时间】:2010-09-07 15:03:09 【问题描述】:

我正在尝试找到一种方法来针对 XSD 验证大型 XML 文件。我看到了...best way to validate an XML... 的问题,但答案都指向使用 Xerces 库进行验证。唯一的问题是,当我使用该库来验证 180 MB 文件时,我得到了 OutOfMemoryException。

是否有任何其他工具、库、策略来验证比普通 XML 文件更大的文件?

编辑:SAX 解决方案适用于 java 验证,但 libxml 工具的其他两个建议对于 java 之外的验证也非常有帮助。

【问题讨论】:

对于一个易于使用的 Windows 工具,您可以使用XML ValidatorBuddy,它在内部使用 Xerces SAX 解析器来验证大文件。 【参考方案1】:

不要使用 DOMParser,而是使用 SAXParser。这从输入流或读取器中读取,因此您可以将 XML 保存在磁盘上,而不是将其全部加载到内存中。

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);

SAXParser parser = factory.newSAXParser();

XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new SimpleErrorHandler());
reader.parse(new InputSource(new FileReader ("document.xml")));

【讨论】:

您没有在此处提供 XSD 进行验证。如何做到这一点?【参考方案2】:

使用libxml,它执行验证并且具有流模式。

【讨论】:

@oob 是的,libxml2 完美运行。此外,如果有人正在寻找 Windows 二进制文件,他们在这里:ftp.zlatkovic.com/libxml【参考方案3】:

我个人喜欢使用XMLStarlet,它有一个命令行界面,并且适用于流。它是一套建立在Libxml2之上的工具。

【讨论】:

【参考方案4】:

如前所述,SAX 和 libXML 会有所帮助。您还可以尝试使用 -Xmx 选项增加 JVM 的最大堆大小。例如。将最大堆大小设置为 512MB:java -Xmx512m com.foo.MyClass

【讨论】:

以上是关于验证一个巨大的 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

模式验证 XML

基础-XML常用的两种验证模式

多个 XML 文件验证的自动化

使用 Java 针对本地 DTD 文件验证 XML 文件

针对同一 XML 模式 (XSD) 加快一批 XML 文件的 XML 模式验证

验证 AndroidManifest.xml 文件