8

假设我有两个项目,A 和 B。Java 项目,以防万一。

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

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

现在,对于项目 B 中的 XSD,我究竟应该把什么作为schemaLocationfor an include

schemaLocation="../core-types.xsd"不太好用(我知道,它需要一个 URI),但是正确或标准的方法到底是什么?谷歌发现我有更多的人问这个问题,关于什么是处理这个问题的正确方法的明确、标准的方法。

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

我不是在寻找诸如“将它们放在共享位置”之类的答案。我正在寻找更多类似于使用相对引用而不是硬编码引用的开发环境的东西。

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

4

2 回答 2

1

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

如果您需要在运行时进行模式验证,那就另当别论了。您可能需要使用 XML 目录。如果你使用的是 JAXB,你应该看看这个问题:jaxb - how to map xsd files to URL to find them

于 2013-03-26T13:47:50.580 回答
0

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

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

上述标识符通常是您在 schema 中使用的schemalocations 或s。namespaceimport

使用此类目录时,为了避免XJC 中的混淆和一些错误schemaLocation,我强烈建议您从 XML 模式中的模式导入中删除所有s,并且只保留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来实现单独的模式编译,即模块化模式编译例如, maven-jaxb2-plugin支持这一点,它还具有对catalogs的高级支持。

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

于 2016-11-23T12:17:47.727 回答