我一直在努力提高针对XSD架构的XML验证性能,特别是在XSD唯一约束方面,并决定尝试Woodstox。我几乎关注this example,只要我将XMLValidationSchema.SCHEMA_ID_DTD
更改为XMLValidationSchema.SCHEMA_ID_W3C_SCHEMA
。
我遇到的问题是,即使XML违反了唯一约束,Woodstox验证器也会发现XML有效。将我的java代码切换回" regular" javax.xml.validation.Schema
,javax.xml.stream.XMLStreamReader
和javax.xml.validation.Validator
正确检测到唯一性约束违规。
另外,我可以确认Woodstox验证器做了什么,因为,例如,我可以看到它说“XML无效”'例如,如果我有一个负数,其中正数是XML中预期的XSD。
可能的是,到目前为止我使用过的工具对于不合格元素的唯一性检查是否合适,而Woodstox不是?这是我想到的唯一想法......
此外,是否有人能够确认Woodstox的性能优于基于Xerces的工具(几乎所有Java中存在的东西?)验证了独特的约束?
任何帮助都非常感谢!
答案 0 :(得分:1)
不确定这是否有帮助,但Woodstox使用Multi-Schema Validator(https://github.com/kohsuke/msv)进行XML Schema和Relax NG验证。因此,如果MSV支持唯一性验证,那么Woodstox也应如此。
如果是这种情况,我不记得副手,但我记得MSV的唯一限制是它不支持默认值的分配(因为MSV的位置是它不进行文档修改而只是验证) ,所以看起来这应该有效。
至于性能:由于Woodstox是完全流式传输而且从不构建树模型(如DOM),因此它将对任何大小的文档执行线性处理,因此对于较大的文档可能更有效。但由于验证是通过MSV进行的,因此很难确定。 最大的问题是Xerces是否基于DOM树进行验证(树的构建是昂贵的部分),或者是否能够只使用SAX解析器。
我建议的一件事是提交针对Woodstox的错误,在:
https://github.com/FasterXML/woodstox
(版本5正在转移到github;您也可以在http://woodstox.codehaus.org处提交Jira问题)
因为理论上MSV集成中的某些东西可能没有完全发挥作用。 如果是这样,欢迎使用一个小例子/测试用例。