1. @XmlAccessorOrder.UNDEFINEDXmlAccessorOrder.UNDEFINED无序
@XmlAccessorOrder.ALPHABETICAL是指按属性的字母顺序排序。


2. @XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错
@XmlType(propOrder = { "id", "name", "age","book"})指定输出顺序

3. @XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。

常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,

分别为:
XmlAccessType.FIELD:java对象中的所有成员变量
XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素

注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,
因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,
只能在getter/setter方法上使用@XmlElement和@XmlAttribute注解,
否则由java对象生成xml时会报同一个属性在java类里存在两次的错误。
同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在java的成员变量上使用了


4. @XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

5. @XmlTransient用于标示在由java对象映射xml时,忽略此属性,在生成的xml文件中不出现此元素。

6. @XmlAttribute:该属性作为类xml节点的attribute

7. @XmlElement:该属性作为xml的element,且可以增加属性(name="NewElementName"),那么生成的xml串的elment的标签是NewElementName


8. @XmlJavaTypeAdapter
JAXB能够内置支持List和Set集合,但是对于Map的支持需要自己处理。
继承自抽象类XmlAdapter<ValueType,BoundType>
类型参数:
BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。
ValueType - JAXB 无需其他操作便知道如何处理的类型。



map转换成xml代码示例

适配器类

packagehb.jaxb;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;importjavax.xml.bind.annotation.adapters.XmlAdapter;//自定义适配器,继承自抽象类XmlAdapter,实现抽象方法marshal和unmarshalpublicclassMapAdapterextendsXmlAdapter<MapEntity[],Map>{@OverridepublicMapEntity[]marshal(Mapmap)throwsException{MapEntity[]list=newMapEntity[map.size()];Setkeyset=map.keySet();intindex=0;for(Iteratoritor=keyset.iterator();itor.hasNext();){MapEntityitem=newMapEntity();item.key=itor.next();item.value=map.get(item.key);list[index++]=item;}returnlist;}@OverridepublicMapunmarshal(MapEntity[]list)throwsException{Mapmap=newHashMap();for(inti=0;i<list.length;i++){MapEntityitem=list[i];map.put(item.key,item.value);}returnmap;}}

packagehb.jaxb;publicclassMapEntity{publicObjectkey;publicObjectvalue;}


Student.java

packagehb.jaxb;importjava.util.HashMap;importjavax.xml.bind.annotation.XmlRootElement;importjavax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;@XmlRootElementpublicclassStudent{privateintid;privateStringname;privateintage;@XmlJavaTypeAdapter(MapAdapter.class)publicHashMap<String,String>getMap(){returnmap;}publicvoidsetMap(HashMap<String,String>map){this.map=map;}privateHashMap<String,String>map;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}//无参够着函数一定需要,否则JXBContext无法正常解析。publicStudent(){super();}publicStudent(intid,Stringname,intage){super();this.id=id;this.name=name;this.age=age;}}



测试代码

@TestpublicvoidmapToXML(){Studentstudent=newStudent(101,"张三",22);HashMap<String,String>map=newHashMap<String,String>();map.put("键1","值1");map.put("键2","值2");student.setMap(map);try{JAXBContextcontext=JAXBContext.newInstance(Student.class);Marshallermarshaller=context.createMarshaller();marshaller.marshal(student,System.out);}catch(JAXBExceptione){e.printStackTrace();}}


生成的xml格式

<map><item><key>键2</key><value>值2</value></item><item><key>键1</key><value>值1</value></item></map>

参考文章:
http://blog.csdn.net/lhzjj/article/details/11796713/

http://www.blogjava.net/alwayscy/archive/2007/10/29/156723.html