2017-02-20 67 views
0

我使用下面的代码片段,使静态块内Schema对象:XSD是否在资源加载时自动加载?

URL url = getClass().getClassLoader().getResource("test.xsd"); 

和test.xsd是进口其他三个XSD文件,

我的问题是将进口时可用参考他们(比如验证时),还是我必须通过创建URL对象来加载导入。

回答

0

不,您必须明确加载导入的XSD,因为getResource()不知道XSD语义 - 它在资源/文件级而不是XSD级别运行。

+0

这不是太好用。 1.'getResource()'不加载任何东西。它只给出资源的URL。 'getResourceAsStream()'做。但是......对于任何由类加载器资源加载的XSD处理器(即验证器)都没有意义。它会尝试通过打开在XSD – Vadim

+0

中定义的模式位置来加载'imports'我想你是对的,我的答案会更适合'getResourceAsStream()'。 – kjhughes

+0

是的。我总是惹他们。 :-)'getResource()'不是一个逻辑名称,只能获取URL。首先,它是一种资源 - 它自己... – Vadim

0

因为当您使用getClass().getClassLoader().getResource("test.xsd");时,您实际上并没有加载test.xsd,但只能获取URL,您不需要执行其他任何操作。

XSD import仅对适当的工具有意义。作为示例验证程序。

因此,当您将模式位置传递给验证器时,它可以是绝对路径,当前工作目录或URL的相对路径。

然后,当验证过程XSD它会尝试获取imports同样的方式 - 因为它在test.xsd定义的绝对路径,相对于test.xsd模式位置或URL。