在项目中指定XSD schemaLocation的正确或正确方法是什么?

时间:2013-03-13 07:13:32

标签: java xsd

假设我有两个项目,A和B. Java项目,如果这很重要的话。

项目A包含一堆代表核心类型和元素的XSD文件。它们都放在一个名为“定义”的包中。这内置于project-a.jar

项目B代表一个扩展项目,允许它定义自己的类型和元素。我创建了一个新模式并将其放在“definition.extension”包中。这内置于project-b.jar

现在,对于项目B中的XSD,我应该准确地将schemaLocation作为include

schemaLocation="../core-types.xsd"没有用(我知道,它需要一个URI),但究竟什么是正确的或标准的方法呢?谷歌发现我有更多的人在问这个问题时采用明确的标准方法来处理这个问题的正确方法。

我不能在运行时以编程方式调整schemaLocation ...或者我需要一个在编译期间动态替换schemaLocation的构建步骤/脚本...正确?

我不是在寻找像“把它们放在共享位置”这样的答案。我正在寻找更多与开发环境相关的东西,它使用相对引用而不是硬编码引用。

仅供参考,我正在使用IntelliJ IDEA,以防有特定于IDE的方法。

2 个答案:

答案 0 :(得分:1)

如果您只是希望IntelliJ停止以红色显示您的包含,您可以在包含中使用一些自定义URI。然后转到项目设置 - > Schema和DTD,您可以将此URI映射到本地文件。

如果您需要在运行时进行架构验证,那就是另一个故事。您可能需要使用XML目录。如果你正在使用JAXB,你应该看一下这个问题:jaxb - how to map xsd files to URL to find them

答案 1 :(得分:0)

您应该使用XML Catalogs。此链接通过XML专家Norman Walsh全面介绍了XML目录 - 以及如何在Java中使用它们。引用:

  

这些目录文件可用于将公共和系统标识符以及其他URI映射到本地文件(或其他URI)。

上述标识符通常是您在架构schemalocation中使用的namespaceimport

使用此类目录时,为了避免混淆和一些bug in XJC,我强烈建议您从XML模式中的模式导入中删除所有schemaLocation,并仅保留namespace (如果你有选择的话)。例如:

<import namespace="http://www.w3.org/1999/xlink" />

然后将每个命名空间的映射指定为目录中的实际架构位置。例如,使用OASIS XML目录格式:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <uri name="http://www.w3.org/1999/xlink" uri="w3c/1999/xlink.xsd" />
</catalog>

在编译时,如果要从模式生成带有JAXB注释的类,我建议您使用Episodes来实现单独的模式编译又名 modular schema compilation < / em>的。例如,maven-jaxb2-plugin支持此功能,该版本也支持catalogs

对于运行时,根据您的XML用例,您应该尝试使用对XML目录具有本机支持的库,例如大多数Java Web服务框架(JAX-WS RI / Metro,Apache CXF ......)正在开发Web服务。如果您不能或者如果您想要更好地控制XML目录(例如,能够从类路径加载模式),我邀请您查看前面提到的XML Entity and URI Resolvers页面,尤其是使用部分具有常用应用程序的目录为您的应用程序添加目录支持。基本上,您使用org.apache.xml.resolver.tools.CatalogResolver和可选(用于更精细控制)org.apache.xml.resolver.CatalogManager类。有关自定义CatalogResolver / CatalogManager的具体示例,您可以查看来自Apache commons-configurationAuthzForceCXF等的代码来源。