我已经在这个问题上待了一段时间,但仍然无法指出它。我有一个使用XML Schema文件的Java项目,这些文件由import导入。所有这些都在同一级别的有效资源目录中,因此我使用类似:
<xs:import schemaLocation="types.xsd"/>
文件 schema.xsd 中的从另一个中导入。现在,当我通过
抓取架构时getResourceAsStream(absolutePath)
验证它我可以加载它;问题是验证器将在主项目目录而不是资源目录中查找导入的 types.xsd 。有没有办法解决这个问题,而无需在schemaLocation中硬编码相对(构建结构相关)路径?
答案 0 :(得分:0)
您的架构(包括导入)应该对读取它的人有效。 schemaLocation由XSD定义,而不是由Java定义。因此,任何导入的模式都应使用相对或绝对路径进行寻址,而不是将其放在Java类路径上。
答案 1 :(得分:0)
在Java XML API中,始终有一个API来教授解析器/验证器/转换器如何解析外部引用:
org.xml.sax.EntityResolver
。 javax.xml.transform.URIResolver
。 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
的一些用户实现,这是一个非常长的接口。)