mag*_*ter 6 java validation xsd jaxp
我正在尝试将一个相当复杂的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实例.
小智 9
如果您使用URL而不是StreamSource,则无需资源解析程序.
URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);
我认为使用StreamSource而不指定基本位置是问题的根源.
解析器无法知道主模式的位置,因此无法解析common/MessageBase.xml.
使用双参数构造函数并传入一个SystemID,它是您开始的路径名.
请参阅StreamSource的javadoc.