我正在尝试针对许多不同的模式验证XML文件(为人为的例子道歉):
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.0和Xerces 2.8.1中存在实际问题.任何人都可以在这里建议出现问题,或者更简单的方法来验证我的XML文档?
Jon*_*Jon 18
所以,如果其他人遇到同样的问题,我需要从单元测试中加载父模式(和隐式子模式) - 作为资源 - 来验证XML String.我使用Xerces XMLSchemFactory与Java 6验证器一起执行此操作.
为了通过include正确加载子模式,我必须编写自定义资源解析器.代码可以在这里找到:
要使用解析程序,请在架构工厂中指定它:
xmlSchemaFactory.setResourceResolver(new ResourceResolver());
Run Code Online (Sandbox Code Playgroud)
它将使用它来通过类路径解析您的资源(在我的例子中来自src/main/resources).欢迎任何评论......
小智 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)