我正在尝试从xsd架构生成Java类,我正在使用JAXB。在大多数情况下,当我运行流程来生成类时,它可以工作。但是,有一些类不会生成成员变量,getter和setter。这就是我所拥有的
文件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>
* <complexType name="ObservationType">
* <complexContent>
* <extension base="{http://earth.esa.int/ns2}ObservationType">
* <sequence>
* <element ref="{http://earth.esa.int/ns3}deliveryInfo" minOccurs="0"/>
* </sequence>
* </extension>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ObservationType")
public class ObservationType
extends mypackage.ns2.ObservationType
{
}
我的问题是为什么不创建必需的成员变量及其setter和getter?架构是否有问题,或者JAXB是否存在限制,以便使用来自不同文件的扩展来创建复杂类型的缺失信息? 先感谢您。您的帮助或意见将不胜感激。
答案 0 :(得分:2)
这个用例奇怪的是,您在XML Schema中具有混合内容的两种类型之间的继承。我认为这里有一个XJC(可能是规范)错误,正如Puce所建议的那样,您应该在以下链接中输入错误:
<强> schema.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>
<强>乙强>
为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 {
}
您可以向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;
}
您可以在B
上扩展属性,以了解c
类型的元素引用。这将允许您正确处理b
和c
类型的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;
}
}