gpt4 book ai didi

java - 在 JAR 中组织 XSD

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:27 25 4
gpt4 key购买 nike

我的 JAR 中有以下结构:

  • 产品.xsd
  • ProductCommonTypes.xsd
  • /com
    • /foo
      • 产品.class

当我这样做的时候

schemaURL = Products.class.getClassLoader().getResource(schemaFile);

我看到“使用 schemaURL: jar:file:/C:/my.jar!/Products.xsd”。我觉得这个很好。

后来,我尝试创建一个架构并收到一个异常,指出“无法将名称 'common:nonEmptyString' 解析为 (n) '类型定义' 组件。”

我认为问题在于它无法找到common:nonEmptyString(位于ProductCommonTypes.xsd中),但无法弄清楚如何修复它。

产品.xsd

  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:p="http://www.foo.com/Products"
targetNamespace="http://www.foo.com/Products"
xmlns:common="http://www.foo.com/ProductsCommonTypes"
elementFormDefault="qualified">

<xs:import schemaLocation="ProductsCommonTypes.xsd"
namespace="http://www.foo.com/ProductsCommonTypes"/>

<xs:element name="products">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="common:nonEmptyString" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

ProductCommonTypes.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.foo.com/ProductsCommonTypes"
xmlns="http://www.foo.com/ProductsCommonTypes"
elementFormDefault="qualified" >

<xs:simpleType name="nonEmptyString">
<xs:annotation>
<xs:documentation>A type that will require a non-empty string value be present
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:pattern value="(\s*[^\s]\s*)+"></xs:pattern>
</xs:restriction>
</xs:simpleType>

<xs:simpleType name="url">
<xs:annotation>
<xs:documentation>A HTTP URL</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:anyURI">
<xs:pattern value="https?://.+"></xs:pattern>
</xs:restriction>
</xs:simpleType>
</xs:schema>

[jaxb - Unable to unmarshall from XSD which included other xsd建议添加所有架构引用,但我正在使用许多架构,这些架构都导入多个其他架构。看起来它很快就会变得丑陋!

  1. 是否有一种通用/动态解决方案,不需要我每次计划使用可能导入其他架构的架构时都识别和硬编码所有架构?

  2. 我计划在某个时候将所有 XSD 移动到 jar 内的 MyXSDs 文件夹中。移动它们后,我是否需要因位置变化而做一些不同的事情?

最佳答案

解决方案

我能够使用 XMLCatalogResolver 解决这个问题并创建一个 XML catalog文件。

我将所有 XSD 移至一个文件夹中,并在 JAR 中具有以下结构:

  • MyXSD
    • 产品.xsd
    • ProductCommonTypes.xsd
  • /com
    • /foo
      • 产品.class

首先,我创建了目录文件并确定了所引用的架构。

<!DOCTYPE catalog
PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

<public
publicId="http://www.foo.com/ProductCommonTypes"
uri="ProductCommonTypes.xsd"/>

</catalog>

然后,我创建了一个XMLCatalogResolver它使用我的目录文件并将其用作我的 SchemaFactory 的 ResourceResolver 。需要注意的是,目录必须按照 constructor's documentation 指定为绝对 URI 的有序数组。 .

// The catalogs must be an ordered array list of *ABSOLUTE* URIs
String[] catalogs = new String[] { xmlCatalogAbsPath };
XMLCatalogResolver resourceResolver = new XMLCatalogResolver(catalogs);
schemaFactory.setResourceResolver(resourceResolver);

您必须指定 XSD 文件的相对路径。因此,因为我将所有内容放入一个文件夹中,所以我将 relatativeSchemaPath="MyXSDs/Products.xsd" 设置为与 ClassLoader.getSystemResource 一起使用。 .

StreamSource streamSource = new StreamSource(ClassLoader.getSystemResource(relatativeSchemaPath).toString());
Schema schema = schemaFactory.newSchema(streamSource);

关于java - 在 JAR 中组织 XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40771208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com