我正在尝试将一个相当复杂的XML模式解析为Java中的Schema对象,因此我可以对XML消息进行一些验证。
我的代码与此类似:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));
我的架构有很多导入:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="base_1">
<xs:import namespace="base_1" schemaLocation="common/MessageBase.xsd"/>
</xs:schema>
...等。当我尝试加载架构时,我遇到了很多错误。基于与此相关的另一个问题,看起来我需要指定一个资源解析器,但这不应该是默认处理的东西吗?
如果是这样,我是否需要将模式放在相对于我正在编写的应用程序或相对于基础模式文件的位置?
最后,当我使用XMLSpy或类似工具加载模式时,它工作正常,我可以毫无问题地验证XML实例。
答案 0 :(得分:8)
我认为使用StreamSource而不指定基本位置是问题的根源。
解析器无法知道主模式的位置,因此无法解析common / MessageBase.xml。
使用双参数构造函数并传入一个SystemID,它是您开始的路径名。
请参阅StreamSource的javadoc。
答案 1 :(得分:8)
如果您使用URL而不是StreamSource,则无需资源解析器。
URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);
答案 2 :(得分:2)
要解析导入的XSD,您必须将架构工厂与资源解析器关联:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(new MyResourceResolver());
Schema schema = factory.newSchema(new StreamSource(new File("schema/schema.xsd")));
有关详细信息,请查看此answer。