我有4节课.Person
类和抽象ContactInformation
与Phone
和Address
类扩展它.
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person {
@XmlElement(required = true, nillable = false)
private String first;
@XmlElement(required = true, nillable = false)
private String last;
@XmlElementWrapper(name = "contacts")
@XmlElementRefs({
@XmlElementRef(name = "phone", type = Phone.class, required = true),
@XmlElementRef(name = "address", type = Address.class, required = true)
})
private final List<ContactInfomation> contacts = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
ContactInformation
仅用作容器:
public abstract class ContactInfomation { /* empty class */ }
Run Code Online (Sandbox Code Playgroud)
Phone
类:
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Phone extends ContactInfomation {
@XmlElement(required = true, nillable = false)
private String number;
}
Run Code Online (Sandbox Code Playgroud)
和Address
班级:
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Address extends ContactInfomation {
@XmlElement(required = true, nillable = false)
private String country;
@XmlElement(required = true, nillable = false)
private String city;
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我换@XmlElementrefs
到@XmlElements
的Person
类,没有任何反应.JAXB
将它们映射到xs:choice
.XML输出与以前相同,并schemagen
生成与以前相同的模式.这是一个示例输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<first>majid</first>
<last>azimi</last>
<contacts>
<address>
<country>US</country>
<city>Los Angles</city>
</address>
<address>
<country>US</country>
<city>New York</city>
</address>
<phone>
<number>5551037</number>
</phone>
</contacts>
</person>
Run Code Online (Sandbox Code Playgroud)
这是架构:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="address" type="address"/>
<xs:element name="person" type="person"/>
<xs:element name="phone" type="phone"/>
<xs:complexType name="person">
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
<xs:element name="contacts" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="phone"/>
<xs:element ref="address"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="phone">
<xs:complexContent>
<xs:extension base="contactInfomation">
<xs:sequence>
<xs:element name="number" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="contactInfomation" abstract="true">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="address">
<xs:complexContent>
<xs:extension base="contactInfomation">
<xs:sequence>
<xs:element name="country" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
文档的@XmlElementRef
使用它来替换组和XML的选择.我完全混淆@XmlElementRefs
/ @XmlElementRef
和@XmlElements
/ 的区别是什么@XmlElement
.有人可以帮忙吗?
bdo*_*han 10
之间的基本Differenece @XmlElement
和@XmlElementRef
@XmlElement
和之间的区别在于,@XmlElementRef
相应的生成元素是否包含本地元素定义或对全局元素定义的引用.
选择和替代团体
XML Schema中的选择实际上是替换组可以完成的超集.因此,为了简化映射,JAXB利用两个映射.
JAXB和Schema Generation
JAXB可以从任何XML Schema生成Java模型,另一方面JAXB不保留有关XML模式的所有元数据.因此,JAXB无法生成每个XML架构.
@XmlElementRefs
/ @XmlElementRef
和@XmlRootElement
以下是您的模型中的内容.
人
我已经修改了contacts
字段上的映射,使得到Address
类的映射更加清晰.
@XmlElementWrapper(name = "contacts")
@XmlElementRefs({
@XmlElementRef(name = "phone", type = Phone.class, required = true),
@XmlElementRef(name = "ADDRESS", type = Address.class, required = true)
})
private final List<ContactInfomation> contacts = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
电话
使用@XmlElementRef
您指定的信息进行映射时,需要与由@XmlRootElement
or 提供的全局元素定义相对应@XmlElementDecl
(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).默认情况下,Person
类的根元素为person
.
@XmlRootElement
public class Person {
Run Code Online (Sandbox Code Playgroud)
地址
我使用了@XmlRootElement
注释覆盖了默认名称Address class
.
@XmlRootElement(name="ADDRESS")
public class Address extends ContactInfomation {
Run Code Online (Sandbox Code Playgroud)
生成的XML架构
这是生成的架构.我们看到结构中的element
定义choice
利用ref
引用现有元素而不是定义局部元素.
<xs:element name="contacts" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="phone"/>
<xs:element ref="ADDRESS"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
@XmlElements
/@XmlElement
我已经更改了您contacts
要使用的字段上的映射@XmlElements
.
人
@XmlElementWrapper(name = "contacts")
@XmlElements({
@XmlElement(name = "phone-number", type = Phone.class, required = true),
@XmlElement(name = "home-address", type = Address.class, required = true)
})
private final List<ContactInfomation> contacts = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
电话
所有引用的类都不需要注释@XmlRootElement
(或具有相应的@XmlElementDecl
注释.
public class Phone extends ContactInfomation {
Run Code Online (Sandbox Code Playgroud)
地址
如果他的类确实有@XmlRootElement
注释,则不需要匹配@XmlElement
注释@XmlElements
.
@XmlRootElement(name="ADDRESS")
public class Address extends ContactInfomation {
Run Code Online (Sandbox Code Playgroud)
生成的XML架构
这是生成的架构.我们看到,element
在中定义choice
的结构现在被定义为本地元素.
<xs:element name="contacts" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="phone-number" type="phone"/>
<xs:element name="home-address" type="address"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16969 次 |
最近记录: |