7

我正在尝试将一个相当复杂的 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>

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

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

最后,当我使用 XMLSpy 或类似工具加载架构时,它工作正常,我可以毫无问题地验证 XML 实例。

4

3 回答 3

11

如果您使用 URL 而不是 StreamSource,则不需要资源解析器。

URL schemaURL = Thread.currentThread().getContextClassLoader().getResource(schemaFileName);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaURL);
于 2013-11-08T07:41:48.207 回答
9

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

解析器无法知道主模式在哪里,因此无法解析 common/MessageBase.xml。

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

请参阅 StreamSource 的 javadoc。

于 2009-11-13T22:53:42.483 回答
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")));

有关更多详细信息,您可以查看此答案

于 2013-08-21T10:59:26.170 回答