资源受路径约束时使用Java getResource

时间:2012-01-19 17:22:50

标签: java xsd

我已经在这个问题上待了一段时间,但仍然无法指出它。我有一个使用XML Schema文件的Java项目,这些文件由import导入。所有这些都在同一级别的有效资源目录中,因此我使用类似:

<xs:import schemaLocation="types.xsd"/>
文件 schema.xsd 中的

从另一个中导入。现在,当我通过

抓取架构时
getResourceAsStream(absolutePath)

验证它我可以加载它;问题是验证器将在主项目目录而不是资源目录中查找导入的 types.xsd 。有没有办法解决这个问题,而无需在schemaLocation中硬编码相对(构建结构相关)路径?

2 个答案:

答案 0 :(得分:0)

您的架构(包括导入)应该对读取它的人有效。 schemaLocation由XSD定义,而不是由Java定义。因此,任何导入的模式都应使用相对或绝对路径进行寻址,而不是将其放在Java类路径上。

答案 1 :(得分:0)

在Java XML API中,始终有一个API来教授解析器/验证器/转换器如何解析外部引用:

  • 对于SAXParsers,有org.xml.sax.EntityResolver
  • 对于变形金刚,有javax.xml.transform.URIResolver
  • 对于Validators,有org.w3c.dom.ls.LSResourceResolver

请注意,它们都是 interfaces ,因此您可以创建自己的实现,然后通过相应的setter方法传递它。

在你的情况下,它应该是这样的:


    Validator validator=createValidator();
    validator.setResourceResolver(new LSResourceResolver() {
         public LSInput resolveResource(String publicId, String systemId, String baseURI) {
             File file=new File(resourcesRoot, systemId);
             return new MyLsInput(file);
         }
    );
    validator.validate(source, result);

MyLsInput 代表org.w3c.dom.ls.LSInput的一些用户实现,这是一个非常长的接口。)