在JAR

时间:2016-11-23 17:51:48

标签: java xsd jaxb

我在JAR中有以下结构:

  • Products.xsd
  • ProductCommonTypes.xsd
  • / COM
    • /富
      • Products.class

当我这样做时

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

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

稍后,我尝试创建一个Schema并获得一个异常,说明“无法将名称'common:nonEmptyString'解析为(n)'类型定义'组件。”

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

Products.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 文件夹中。移动它们之后,由于位置变化,我是否必须做任何不同的事情?

1 个答案:

答案 0 :(得分:0)

解决方案

&#xA;&#xA;

我能够使用 XMLCatalogResolver 并创建 XML目录文件。

&#xA;&#xA;

我将所有XSD移动到一个文件夹中在我的JAR中具有以下结构:

&#xA;&#xA;
    &#xA;
  • MyXSDs&#xA;&#xA;
      &#xA;
    • 产品。 XSD
    • &#XA;
    • ProductCommonTypes.xsd
    • &#XA;
  • &#XA;
  • / COM&#XA;&#XA;
      &#XA;
    • /富&#XA;&#XA;
        &#XA;
      • Products.class
      • &#XA;
    • &#XA; < / ul> &#xA;
    &#xA;&#xA;

    首先,我创建了目录文件并确定了被引用的模式。

    &#xA; &#xA;
     &lt;!DOCTYPE catalog&#xA; PUBLIC“ -  // OASIS // DTD实体解析XML目录V1.0 // EN”&#xA; “http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
     &lt; catalog xmlns =“urn:oasis:names:tc:entity:xmlns:xml:catalog”&gt;&#xA;&#xA; &LT;公共&#XA; publicId = “http://www.foo.com/ProductCommonTypes” &#XA; uri =“ProductCommonTypes.xsd”/&gt;&#xA;&#xA;&lt; / catalog&gt;&#xA;  
    &#xA;&#xA;

    然后,我创建了使用的 XMLCatalogResolver 我的目录文件并将其用作我的的SchemaFactory 。请务必注意,必须根据绝对URI的有序数组 /org/apache/xerces/util/XMLCatalogResolver.html#XMLCatalogResolver(java.lang.String [])“rel =”nofollow noreferrer“>构造函数的文档

    &#xA;&#xA;
      //目录必须是* ABSOLUTE * URIs的有序数组列表&#xA; String [] catalogs = new String [] {xmlCatalogAbsPath};&#xA; XMLCatalogResolver resourceResolver = new XMLCatalogResolver(catalogs); &#xA; schemaFactory.setResourceResolver(resourceResolver);&#xA;  
    &#xA;&#xA;

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

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