根据多个架构定义验证 XML 文件

2024-01-12

我正在尝试根据许多不同的模式验证 XML 文件(对人为的示例表示歉意):

  • a.xsd
  • b.xsd
  • c.xsd

c.xsd 特别是导入 b.xsd 和 b.xsd 导入 a.xsd,使用:

<xs:include schemaLocation="b.xsd"/>

我尝试通过 Xerces 按以下方式执行此操作:

XMLSchemaFactory xmlSchemaFactory = new XMLSchemaFactory();
Schema schema = xmlSchemaFactory.newSchema(new StreamSource[] { new StreamSource(this.getClass().getResourceAsStream("a.xsd"), "a.xsd"),
                                                         new StreamSource(this.getClass().getResourceAsStream("b.xsd"), "b.xsd"),
                                                         new StreamSource(this.getClass().getResourceAsStream("c.xsd"), "c.xsd")});     
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlContent)));

但这无法正确导入所有三个模式,导致无法将名称“blah”解析为(n)“组”组件。

我已经使用成功验证了这一点Python,但有真正的问题Java 6.0 and 练习2.8.1。任何人都可以建议这里出了什么问题,或者验证我的 XML 文档的更简单的方法吗?


因此,为了防止其他人在这里遇到同样的问题,我需要从单元测试中加载父架构(和隐式子架构)(作为资源)来验证 XML 字符串。我使用 Xerces XMLSchemFactory 和 Java 6 验证器来完成此操作。

为了通过包含正确加载子架构,我必须编写一个自定义资源解析器。代码可以在这里找到:

https://code.google.com/p/xmlsanity/source/browse/src/com/arc90/xmlsanity/validation/ResourceResolver.java https://code.google.com/p/xmlsanity/source/browse/src/com/arc90/xmlsanity/validation/ResourceResolver.java

要使用解析器,请在架构工厂上指定它:

xmlSchemaFactory.setResourceResolver(new ResourceResolver());

它将使用它通过类路径解析您的资源(在我的例子中是从 src/main/resources )。欢迎对此提出任何意见...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据多个架构定义验证 XML 文件 的相关文章

随机推荐