在对象模型中没有足够信息的用例中,使用JAXBElement保留元素名称/命名空间。最常见的情况是取代基:
与替代组:
<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org" xmlns="http://www.example.org" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element ref="anElement"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="anElement" type="xs:string"/> <xs:element name="aSubstituteElement" type="xs:string" substitutionGroup="anElement"/></xs:schema>
将产生:
package org.example;import javax.xml.bind.JAXBElement;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = { "anElement"})@XmlRootElement(name = "root")public class Root { @XmlElementRef(name = "anElement", namespace = "http://www.example.org", type = JAXBElement.class) protected JAXBElement<String> anElement; public JAXBElement<String> getAnElement() { return anElement; } public void setAnElement(JAXBElement<String> value) { this.anElement = ((JAXBElement<String> ) value); }}没有替代组:
如果删除替换组:
<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org" xmlns="http://www.example.org" elementFormDefault="qualified"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element ref="anElement"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="anElement" type="xs:string"/></xs:schema>
将生成以下类:
package org.example;import javax.xml.bind.annotation.*;@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "", propOrder = { "anElement"})@XmlRootElement(name = "root")public class Root { @XmlElement(required = true) protected String anElement; public String getAnElement() { return anElement; } public void setAnElement(String value) { this.anElement = value; }}解组时还可能会得到一个JAXBElement,请比较以下示例:
- 没有任何JAXB元数据,结果将包装在JAXBElement中
- 使用@XmlRootElement消除了根级别JAXBElement



