我使用下面的代码片段,使静态块内Schema对象:XSD是否在资源加载时自动加载?
URL url = getClass().getClassLoader().getResource("test.xsd");
和test.xsd是进口其他三个XSD文件,
我的问题是将进口时可用参考他们(比如验证时),还是我必须通过创建URL对象来加载导入。
我使用下面的代码片段,使静态块内Schema对象:XSD是否在资源加载时自动加载?
URL url = getClass().getClassLoader().getResource("test.xsd");
和test.xsd是进口其他三个XSD文件,
我的问题是将进口时可用参考他们(比如验证时),还是我必须通过创建URL对象来加载导入。
不,您必须明确加载导入的XSD,因为getResource()
不知道XSD语义 - 它在资源/文件级而不是XSD级别运行。
因为当您使用getClass().getClassLoader().getResource("test.xsd");
时,您实际上并没有加载test.xsd
,但只能获取URL,您不需要执行其他任何操作。
XSD import
仅对适当的工具有意义。作为示例验证程序。
因此,当您将模式位置传递给验证器时,它可以是绝对路径,当前工作目录或URL的相对路径。
然后,当验证过程XSD它会尝试获取imports
同样的方式 - 因为它在test.xsd
定义的绝对路径,相对于test.xsd
模式位置或URL。
这不是太好用。 1.'getResource()'不加载任何东西。它只给出资源的URL。 'getResourceAsStream()'做。但是......对于任何由类加载器资源加载的XSD处理器(即验证器)都没有意义。它会尝试通过打开在XSD – Vadim
中定义的模式位置来加载'imports'我想你是对的,我的答案会更适合'getResourceAsStream()'。 – kjhughes
是的。我总是惹他们。 :-)'getResource()'不是一个逻辑名称,只能获取URL。首先,它是一种资源 - 它自己... – Vadim