5

我正在尝试从 xsd 模式生成 Java 类,并且我正在使用 JAXB。在大多数情况下,当我运行该过程以生成它可以工作的类时。但是,有一些类不会生成成员变量 getters 和 setters。这是我所拥有的

文件 ns2.xsd

<xs:element name="Observation" type="ns2:ObservationType" substitutionGroup="ns1:_MetaData"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:complexContent mixed="true">
        <xs:extension base="ns1:AbstractType">
            <xs:sequence>
                    <xs:element ref="ns2:identifier"/>

            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

文件 ns3.xsd

<xs:element name="Observation" type="ns3:ObservationType" substitutionGroup="ns2:Observation"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:annotation>
        <xs:documentation>this extends the ns2:ObservationType </xs:documentation>
    </xs:annotation>
    <xs:complexContent mixed="true">
        <xs:extension base="ns2:ObservationType">
            <xs:sequence>
                <xs:element ref="ns3:deliveryInfo" minOccurs="0"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这将创建一个空类

package mypackage.ns3;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
 * this extends the ns2:ObservationType 
 * 
 * <p>Java class for ObservationType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="ObservationType">
 *   &lt;complexContent>
 *     &lt;extension base="{http://earth.esa.int/ns2}ObservationType">
 *       &lt;sequence>
 *         &lt;element ref="{http://earth.esa.int/ns3}deliveryInfo" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ObservationType")
public class ObservationType
    extends mypackage.ns2.ObservationType
{


}

我的问题是为什么不创建所需的成员变量及其 setter 和 getter?架构是否有问题,或者 JAXB 是否存在限制以创建使用不同文件扩展名的复杂类型的缺失信息?先感谢您。您的帮助或意见将不胜感激。

4

1 回答 1

2

这个用例的奇怪之处在于,您在 XML Schema 中具有混合内容的两种类型之间的继承关系。我认为这里有一个 XJC(可能还有规范)错误,按照 Puce 的建议,您应该在以下链接中输入一个错误:

XML 模式

架构.xsd

这是一个更简单的 XML 模式,它重现了相同的问题:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <complexType name="b" mixed="true">
                 <sequence>
                   <element ref="tns:bb"/>
                </sequence>
    </complexType>


    <complexType name="c">
        <complexContent mixed="true">
            <extension base="tns:b">
                <sequence>
                   <element ref="tns:cc"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

    <element name="bb" type="string"/>

    <element name="cc" type="string"/>

</schema>

不正确的 Java 模型

为该类型生成的b类很好。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}

C

为类型生成的c类是错误的,问题是它应该是什么?

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C extends B {


}

更好的 Java 模型?- 选项1

您可以向C该类添加一个属性。然后问题归结为混合文本中的哪一个位于继承自的属性中B,哪些位于定义的属性中C

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C
    extends B
{

    @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content2;

}

更好的 Java 模型?- 选项 #2

您可以扩展属性B以了解类型中的元素引用c。这将允许您正确处理bc类型的 XML,但允许某些对 XML 模式无效的文档。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRefs({
        @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class),
        @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    })
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}
于 2013-07-31T20:52:48.193 回答