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>
因为 FlattenedSKU 和 SKU 在不同的命名空间中。因此,我为 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>
注意这里引用的元素
我正在尝试通过 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,然后将其导入到 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>
注意这里引用的元素