VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JAXB学习总结

  JAXB是一个很方便的类库,实现了XML与Java对象的映射,先不总结,具体可看:http://blog.csdn.net/a9529lty/article/details/8232932;

  直接上代码:

public class EXP301 {
    
    private EntryHead entryHead;
    private List<EntryList> entryLists;
    private EntryDocu entryDocu;
    
    public EntryHead getEntryHead() {
        return entryHead;
    }
    @XmlElement(name = "EntryHead", nillable = true)
    public void setEntryHead(EntryHead entryHead) {
        this.entryHead = entryHead;
    }
    public List<EntryList> getEntryLists() {
        return entryLists;
    }
    @XmlElement(name = "EntryList", nillable = true)
    public void setEntryLists(List<EntryList> entryLists) {
        this.entryLists = entryLists;
    }
    public EntryDocu getEntryDocu() {
        return entryDocu;
    }
    @XmlElement(name = "EntryDocu", nillable = true)
    public void setEntryDocu(EntryDocu entryDocu) {
        this.entryDocu = entryDocu;
    }
}

@XmlRootElement
public class Package {
    
    private EnvelopInfo envelopInfo;
    private DataInfo dataInfo;
    
    public EnvelopInfo getEnvelopInfo() {
        return envelopInfo;
    }
    @XmlElement(name = "EnvelopInfo", nillable = true)
    public void setEnvelopInfo(EnvelopInfo envelopInfo) {
        this.envelopInfo = envelopInfo;
    }
    public DataInfo getDataInfo() {
        return dataInfo;
    }
    @XmlElement(name = "DataInfo", nillable = true)
    public void setDataInfo(DataInfo dataInfo) {
        this.dataInfo = dataInfo;
    }
}

 

  生成XML与解析XML:

        FileOutputStream os = null;
        try {
            os = new FileOutputStream(FILE_NAME);
            JAXBContext context = JAXBContext.newInstance(Package.class);
            javax.xml.bind.Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(package1, os);
        } finally {
            if (os != null) {
                os.close();
            }
        }
        FileInputStream inputStream = null;
        inputStream = new FileInputStream("D:"+ File.separator+"VV"+ File.separator+"MyEclipse"+ File.separator+"MyEclipseWorkspace"+ File.separator+"test" + File.separator+ FILE_NAME);
        JAXBContext context = JAXBContext.newInstance(Package.class);
        javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();
        Package package1 = (Package) unmarshaller.unmarshal(inputStream);

  这个类库是我用过的最好的对象与XML相互转换的类库,使用简单,注解配置方便强大;

  下面讲一下注解:

  @XmlRootElement 根节点,使用该类库时,作为参数的类就是该注解修饰的类;

  @XmlElement(name = "EnvelopInfo", nillable = true) 属性name用于设置对应标签的标签名,@XmlElement修饰的setter方法表示对应的属性会作为XML的结点,nillable = true表示即便属性为null,也存在节点,形如<EntryList/>(默认属性为null,XML里就不存在对应的节点),@XmlElement也可直接修饰属性;

  还可以设置节点的顺序:

    使用@XmlType注解,里面的属性porOrder就用于设置节点的顺序,该属性的类型是字符串数组;

  资料在这存档(转自http://blog.csdn.net/a9529lty/article/details/8232932):

    

 常用annotation使用说明

  1. @XmlType

  @XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:

@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

  2.@XmlElement

  @XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:

  @XmlElement(name="Address")  
  private String yourAddress;

  3.@XmlRootElement

  @XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:

  @XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement
  public class Address {}

  4.@XmlAttribute

  @XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
  @XmlAttribute(name="Country")
  private String state;

  5.@XmlAccessorType

  @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注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限   为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

  6.@XmlAccessorOrder

  @XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

  AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

  XmlAccessOrder.UNDEFINED:不排序

  7.@XmlTransient

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

  8.@XmlJavaTypeAdapter

  @XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

  @XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类

  XmlAdapter如下:

public abstract class XmlAdapter<ValueType,BoundType> {
    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

  本文部分内容转自:http://blog.csdn.net/a9529lty/article/details/8232932;

 

posted on 2016-07-02 08:36  bobo2018  阅读(292)  评论(0)    收藏  举报