针对多个模式定义验证XML文件

Jon*_*Jon 35 java xsd xerces

我正在尝试针对许多不同的模式验证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)));
Run Code Online (Sandbox Code Playgroud)

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

我已经使用Python成功验证了这一点,但是在Java 6.0Xerces 2.8.1中存在实际问题.任何人都可以在这里建议出现问题,或者更简单的方法来验证我的XML文档?

Jon*_*Jon 18

所以,如果其他人遇到同样的问题,我需要从单元测试中加载父模式(和隐式子模式) - 作为资源 - 来验证XML String.我使用Xerces XMLSchemFactory与Java 6验证器一起执行此操作.

为了通过include正确加载子模式,我必须编写自定义资源解析器.代码可以在这里找到:

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

要使用解析程序,请在架构工厂中指定它:

xmlSchemaFactory.setResourceResolver(new ResourceResolver());
Run Code Online (Sandbox Code Playgroud)

它将使用它来通过类路径解析您的资源(在我的例子中来自src/main/resources).欢迎任何评论......

  • 有没有机会进一步详细说明自定义资源解析器如何使这一切工作?谢谢. (4认同)
  • 该链接不再起作用,但是您在这里找到了代码示例:http://code.google.com/p/xmlsanity/source/browse/src/com/arc90/xmlsanity/validation/ResourceResolver.java?r = 03a92d97f15904b3892922e45724bb086d54fa4e。 (2认同)
  • 据我所知,代码现在在这里:https://github.com/arc90/xmlsanity/blob/master/src/main/java/com/arc90/xmlsanity/util/ClassBasedResourceResolver.java (2认同)

小智 6

http://www.kdgregory.com/index.php?page=xml.parsing 部分' 单个文档多个模式 '

我的解决方案基于该文档:

URL xsdUrlA = this.getClass().getResource("a.xsd");
URL xsdUrlB = this.getClass().getResource("b.xsd");
URL xsdUrlC = this.getClass().getResource("c.xsd");

SchemaFactory schemaFactory = schemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
//---
String W3C_XSD_TOP_ELEMENT =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
   + "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">\n"
   + "<xs:include schemaLocation=\"" +xsdUrlA.getPath() +"\"/>\n"
   + "<xs:include schemaLocation=\"" +xsdUrlB.getPath() +"\"/>\n"
   + "<xs:include schemaLocation=\"" +xsdUrlC.getPath() +"\"/>\n"
   +"</xs:schema>";
Schema schema = schemaFactory.newSchema(new StreamSource(new StringReader(W3C_XSD_TOP_ELEMENT), "xsdTop"));
Run Code Online (Sandbox Code Playgroud)