我试图从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>
Run Code Online (Sandbox Code Playgroud)
文件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>
Run Code Online (Sandbox Code Playgroud)
这会创建一个空类
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
{
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么不创建所需的成员变量及其setter和getter?架构是否有问题,或者JAXB是否存在限制,以便使用来自不同文件的扩展来创建复杂类型的缺失信息?先感谢您.您的帮助或意见将不胜感激.
这个用例的奇怪之处在于,您的 XML 架构中具有混合内容的两种类型之间的继承。我认为这里存在一个 XJC(可能还有规范)错误,按照 Puce 的建议,您应该在以下链接中输入一个错误:
架构.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>
Run Code Online (Sandbox Code Playgroud)
乙
为该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;
}
}
Run Code Online (Sandbox Code Playgroud)
C
为该c
类型生成的类是错误的,问题是它应该是什么?
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C extends B {
}
Run Code Online (Sandbox Code Playgroud)
您可以向类添加属性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;
}
Run Code Online (Sandbox Code Playgroud)
您可以扩展属性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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2337 次 |
最近记录: |