用Java解析Schema使用import和includes?

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")));
Run Code Online (Sandbox Code Playgroud)

我的架构有很多导入:

<?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>
Run Code Online (Sandbox Code Playgroud)

...等等.当我尝试加载架构时,我遇到了很多错误.基于与此相关的另一个问题,看起来我需要指定一个资源解析器,但这不是应该默认处理的东西吗?

如果是这样,是否有一个特定的目录,我需要将模式放在相对于我正在编写的应用程序或相对于基础模式文件的位置?

最后,当我使用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);
Run Code Online (Sandbox Code Playgroud)

  • 我已经使用URL完成了它,但是当它必须处理导入时仍然无法正确解析资源.我使用了ResourceResolver,虽然它已经修复了.为什么它对你有用,而对我不起作用仍然是个问题.也许它与项目结构有关.我的xsd文件中的路径是相对于我的java类路径的,我最好的猜测是你的相对于你的工作文件夹. (2认同)

bma*_*ies 8

我认为使用StreamSource而不指定基本位置是问题的根源.

解析器无法知道主模式的位置,因此无法解析common/MessageBase.xml.

使用双参数构造函数并传入一个SystemID,它是您开始的路径名.

请参阅StreamSource的javadoc.

  • @bmargulies:花了4小时才发现这就是为什么我的xml-schema中的include-tags没有解析的原因,我很乐意给你+10这个答案:)除了你的信息:实际上是StreamSource (File)构造函数通过查询File中的URL来设置systemId本身.这里的问题似乎是他通过了一条相对的道路.我遇到了同样的问题,因为我使用了StreamSource(InputStream),当然也没有提供有关路径的任何信息 - 除非你明确地设置它.供我自己和他人参考:D (2认同)