【发布时间】:2018-10-09 12:38:33
【问题描述】:
我正在做一个项目,该项目需要针对其 XSD 验证许多 XML 文件,我遇到的问题是许多 XSD 文件依赖于其他 XSD,这使得通常的验证类型麻烦,有没有优雅的方法来解决这个问题?
如果可能的话,我希望在内存中使用这些文件,这些文件不在符合其导入路径的简洁目录结构中。
请注意我正在使用 Java 语言。
【问题讨论】:
标签: java xml validation xsd
我正在做一个项目,该项目需要针对其 XSD 验证许多 XML 文件,我遇到的问题是许多 XSD 文件依赖于其他 XSD,这使得通常的验证类型麻烦,有没有优雅的方法来解决这个问题?
如果可能的话,我希望在内存中使用这些文件,这些文件不在符合其导入路径的简洁目录结构中。
请注意我正在使用 Java 语言。
【问题讨论】:
标签: java xml validation xsd
这里假设您使用 JAXP,因此您可以在 SAXParserFactory 或 `DocumentBuilderFactory 上使用 setSchema()。
我参与的一个解决方案是使用 SchemaFactory.newSchema(Source[] schemas) 将所有 XSD 源读入聚合的 Schema 对象。然后,此聚合模式能够验证引用任何“顶级”模式的任何 XML 文档;所有imported 模式都必须是聚合模式的一部分。我记得,必须对 Source 数组按依赖进行排序,这样如果 Schema A 导入了 Schema B,则必须在数组中的 Schema A 之前出现 Schema B。
另外,我记得,<include> 在这种机制下效果不佳。
另一种解决方案是在 ShemaFactory 上设置 LSResourceResolver。您必须实现自己的LSResourceresolver,它根据解析器的输入提供字节流或字符流。我没有亲自使用或研究过这个解决方案。
第一个解决方案当然有这样的好处,即模式解析和处理可以一次性完成,并重复用于随后的所有验证;第二种选择可能很难实现。
要记住的另一件事(取决于您的上下文):控制整个“解析”过程(即控制解析器如何访问外部资源),从性能以及安全角度。
【讨论】: