XSD:通过 Jaxb 插件生成 POJO 时,不同命名空间的导入元素正在占用 parent 的目标命名空间

XSD: Imported elements of a different namespace are taking up the target namespace of the parent when generating POJOs via the Jaxb plugin

我正在尝试通过 Maven JAXB 插件生成 POJO 来解析我得到的 XML。我的 XML 中有一个根级元素,它有一个不同于其中其他元素的名称空间。以下是 XML:

        <?xml version="1.0" encoding="UTF-8"?>
<skuFlatFileType xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd" xmlns:ns0="http://www.xyz/schemas/dbm/product/V1">
       <FlattenedSKU>
          <ns0:SKU></ns0:SKU>
</FlattenedSKU>
</skuFlatFileType>

因为 FlattenedSKUSKU 在不同的命名空间中。因此,我为 FlattenedSKU 下的所有元素声明了一个单独的 XSD,然后将其导入到 parent 中。 XSD 看起来像这样:

sku_wrapper.xsd

<xs:schema
    xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd"
     targetNamespace="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    xmlns:ns0="http://www.xyz/schemas/dbm/product/V1">
    <xs:import namespace="http://www.xyz/schemas/dbm/product/V1"
        schemaLocation="sku.xsd" />
    <xs:element name="FlattenedSKU">
         <xs:complexType>
            <xs:sequence>
                <xs:element name="SKU" type="ns0:SKU"/>
            </xs:sequence>
        </xs:complexType>
        </xs:element>
       </xs:schema>

childxsd如下:

sku.xsd

<xs:schema attributeFormDefault="qualified"
    elementFormDefault="qualified"
    xmlns="http://www.xyz/schemas/dbm/product/V1"
    targetNamespace="http://www.xyz/schemas/dbm/product/V1"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="SKU">
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

现在生成的 java class 看起来像这样:

@XmlRootElement(name = "FlattenedSKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd")
public class FlattenedSKU {

@XmlElement(name = "SKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd", required = true)
protected SKU sku;

但我需要的是:

@XmlRootElement(name = "FlattenedSKU", namespace = "http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd")
public class FlattenedSKU {

@XmlElement(name = "SKU", namespace = "http://www.xyz/schemas/dbm/product/V1", required = true)
protected SKU sku;

有人可以告诉我我做错了什么吗?

除了我的评论之外,您应该对 sku.xsd 中的元素 "ref" 而不是在 sku_wrapper.xsd

中创建元素

所以以下内容对您有用:

sku.xsd

 <xs:schema attributeFormDefault="qualified"
    elementFormDefault="qualified"
    xmlns="http://www.xyz/schemas/dbm/product/V1"
    targetNamespace="http://www.xyz/schemas/dbm/product/V1"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="SKU">
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>
     <xs:element name="SKU" type="SKU"/> 
</xs:schema>

注意这里的变化是元素的声明。

sku_wrapper.xsd

<xs:schema
    xmlns="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd"
     targetNamespace="http://www.abc/schemas/xyz/sdf/Schemas/Schema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"
    xmlns:ns0="http://www.xyz/schemas/dbm/product/V1">
   <xs:import namespace="http://ww

w.xyz/schemas/dbm/product/V1"
        schemaLocation="sku.xsd" />
    <xs:element name="FlattenedSKU">
         <xs:complexType>
            <xs:sequence>
                   <xs:element ref="ns0:SKU"/>
            </xs:sequence>
        </xs:complexType>
        </xs:element>
  </xs:schema>

注意这里引用的元素