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

时间:2017-05-11 06:17:41

标签: java xml xsd jaxb xjc

我试图通过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>

由于 FlattenedSKU SKU 位于不同的命名空间中。所以我为FlattenedSKU下的所有元素声明了一个单独的XSD,然后将其导入到父元素中。 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>

子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:schema>

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

@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;

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

1 个答案:

答案 0 :(得分:1)

除了我的评论,你要做的是&#34;参考&#34;到sku.xsd中的元素,而不是在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>

注意元素的引用