一.Jaxb处理java对象和xml之间转换常用的annotation有:

  1. @XmlType
  2. @XmlElement
  3. @XmlRootElement
  4. @XmlAttribute
  5. @XmlAccessorType
  6. @XmlAccessorOrder
  7. @XmlTransient
  8. @XmlJavaTypeAdapter

 二.常用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);
}

 三.示例

  1.Shop.java

  1. package jaxb.shop;
  2. import java.util.Set;
  3. import javax.xml.bind.annotation.XmlAccessOrder;
  4. import javax.xml.bind.annotation.XmlAccessType;
  5. import javax.xml.bind.annotation.XmlAccessorType;
  6. import javax.xml.bind.annotation.XmlAttribute;
  7. import javax.xml.bind.annotation.XmlElement;
  8. import javax.xml.bind.annotation.XmlRootElement;
  9. import javax.xml.bind.annotation.XmlType;
  10. import javax.xml.bind.annotation.XmlElementWrapper;
  11. import javax.xml.bind.annotation.XmlAccessorOrder;
  12. @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
  13. @XmlAccessorType(XmlAccessType.FIELD)
  14. @XmlType(name = "shop", propOrder = { "name", "number", "describer", "address","orders" })
  1. @XmlRootElement(name = "CHMart")
  2. public class Shop {
  3. @XmlAttribute
  4. private String name;
  5. // @XmlElement
  6. private String number;
  7. @XmlElement
  8. private String describer;
  9. @XmlElementWrapper(name = "orders")
  10. @XmlElement(name = "order")
  11. private Set<Order> orders;
  12. @XmlElement
  13. private Address address;
  14. public Shop() {
  15. }
  16. public Shop(String name, String number, String describer, Address address) {
  17. this.name = name;
  18. this.number = number;
  19. this.describer = describer;
  20. this.address = address;
  21. }
  22. getter/setter略
  1. //同时使用了@XmlType(propOrder={})和@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL),但是生成的xml只按照propOrder定义的顺序生成元素

  2.Order.java

  1. package jaxb.shop;
  2. import java.math.BigDecimal;
  3. import java.util.Date;
  4. import javax.xml.bind.annotation.XmlAccessType;
  5. import javax.xml.bind.annotation.XmlAccessorType;
  6. import javax.xml.bind.annotation.XmlAttribute;
  7. import javax.xml.bind.annotation.XmlRootElement;
  8. import javax.xml.bind.annotation.XmlType;
  9. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  10. @XmlType(name="order",propOrder={"shopName","orderNumber","price","amount","purDate","customer"})
  11. @XmlAccessorType(XmlAccessType.FIELD)
  12. @XmlRootElement
  13. public class Order {
  14. //  @XmlElement  
  15. private String shopName;
  16. @XmlAttribute
  17. private String orderNumber;
  18. //  @XmlElement
  19. @XmlJavaTypeAdapter(value=DateAdapter.class)
  20. private Date purDate;
  21. //  @XmlElement
  22. private BigDecimal price;
  23. //  @XmlElement
  24. private int amount;
  25. //  @XmlElement
  26. private Customer customer;
  27. public Order() {
  28. }
  29. public Order(String shopName, String orderNumber, Date purDate,
  30. BigDecimal price, int amount) {
  31. this.shopName = shopName;
  32. this.orderNumber = orderNumber;
  33. this.purDate = purDate;
  34. this.price = price;
  35. this.amount = amount;
  36. }
  1. getter/setter略
  1. //@XmlAccessorType(XmlAccessType.FIELD),所以此处注释掉了@XmlElement,xml中依然会生成这些元素

  3.Customer.java

  1. package jaxb.shop;
  2. import java.util.Set;
  3. import javax.xml.bind.annotation.XmlType;
  4. import javax.xml.bind.annotation.XmlAttribute;
  5. import javax.xml.bind.annotation.XmlElement;
  6. import javax.xml.bind.annotation.XmlRootElement;
  7. import javax.xml.bind.annotation.XmlAccessType;
  8. import javax.xml.bind.annotation.XmlAccessorType;
  9. @XmlType
  10. @XmlAccessorType(XmlAccessType.FIELD)
  11. @XmlRootElement
  12. public class Customer {
  13. @XmlAttribute
  14. private String name;
  15. private String gender;
  16. private String phoneNo;
  17. private Address address;
  18. private Set<Order> orders;
  19. public Customer() {
  20. }
  21. public Customer(String name, String gender, String phoneNo, Address address) {
  22. this.name = name;
  23. this.gender = gender;
  24. this.phoneNo = phoneNo;
  25. this.address = address;
  26. }
  1. getter/setter略

  4.Address.java

  1. package jaxb.shop;
  2. import javax.xml.bind.annotation.XmlAttribute;
  3. import javax.xml.bind.annotation.XmlType;
  4. import javax.xml.bind.annotation.XmlElement;
  5. import javax.xml.bind.annotation.XmlRootElement;
  6. import javax.xml.bind.annotation.XmlAccessType;
  7. import javax.xml.bind.annotation.XmlAccessorType;
  8. import javax.xml.bind.annotation.XmlAccessOrder;
  9. import javax.xml.bind.annotation.XmlAccessorOrder;
  10. @XmlType(propOrder={"state","province","city","street","zip"})
  11. @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
  12. @XmlAccessorType(XmlAccessType.NONE)
  13. @XmlRootElement
  14. public class Address {
  15. @XmlAttribute 
  16. private String state;
  17. @XmlElement
  18. private String province;
  19. @XmlElement
  20. private String city;
  21. @XmlElement
  22. private String street;
  23. @XmlElement
  24. private String zip;
  25. public Address() {
  26. super();
  27. }
  28. public Address(String state, String province, String city, String street,
  29. String zip) {
  30. super();
  31. this.state = state;
  32. this.province = province;
  33. this.city = city;
  34. this.street = street;
  35. this.zip = zip;
  36. }
  1. getter/setter略
  1. //注意:虽然@XmlAccessorType为XmlAccessType.NONE,但是在java类的私有属性上加了@XmlAttribute和@XmlElement注解后,这些私有成员会映射生成xml的元素

  5.DateAdapter.java

  1. package jaxb.shop;
  2. import java.util.Date;
  3. import java.text.SimpleDateFormat;
  4. import javax.xml.bind.annotation.adapters.XmlAdapter;
  5. public class DateAdapter extends XmlAdapter<String, Date> {
  6. private String pattern = "yyyy-MM-dd HH:mm:ss";
  7. SimpleDateFormat fmt = new SimpleDateFormat(pattern);
  8. @Override
  9. public Date unmarshal(String dateStr) throws Exception {
  10. return fmt.parse(dateStr);
  11. }
  12. @Override
  13. public String marshal(Date date) throws Exception {
  14. return fmt.format(date);
  15. }
  16. }
  1. //用于格式化日期在xml中的显示格式,并且由xml unmarshal为java对象时,将字符串解析为Date对象

  6.ShopTest.java

  1. package jaxb.shop;
  2. import java.io.FileReader;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.math.BigDecimal;
  6. import java.util.Date;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9. import javax.xml.bind.JAXBContext;
  10. import javax.xml.bind.JAXBException;
  11. import javax.xml.bind.Marshaller;
  12. import javax.xml.bind.Unmarshaller;
  13. public class ShopTest {
  14. public static void main(String[] args) throws JAXBException, IOException{
  15. Set<Order> orders = new HashSet<Order>();
  16. Address address1 = new Address("China", "ShangHai", "ShangHai", "Huang", "200000");
  17. Customer customer1 = new Customer("Jim", "male", "13699990000", address1);
  18. Order order1 = new Order("Mart", "LH59900", new Date(), new BigDecimal(60), 1);
  19. order1.setCustomer(customer1);
  20. Address address2 = new Address("China", "JiangSu", "NanJing", "ZhongYangLu", "210000");
  21. Customer customer2 = new Customer("David", "male", "13699991000", address2);
  22. Order order2 = new Order("Mart", "LH59800", new Date(), new BigDecimal(80), 1);
  23. order2.setCustomer(customer2);
  24. orders.add(order1);
  25. orders.add(order2);
  26. Address address3 = new Address("China", "ZheJiang", "HangZhou", "XiHuRoad", "310000");
  27. Shop shop = new Shop("CHMart", "100000", "EveryThing",address3);
  28. shop.setOrder(orders);
  29. FileWriter writer = null;
  30. JAXBContext context = JAXBContext.newInstance(Shop.class);
  31. try {
  32. Marshaller marshal = context.createMarshaller();
  33. marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  34. marshal.marshal(shop, System.out);
  35. writer = new FileWriter("shop.xml");
  36. marshal.marshal(shop, writer);
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. Unmarshaller unmarshal = context.createUnmarshaller();
  41. FileReader reader = new FileReader("shop.xml") ;
  42. Shop shop1 = (Shop)unmarshal.unmarshal(reader);
  43. Set<Order> orders1 = shop1.getOrder();
  44. for(Order order : orders1){
  45. System.out.println("***************************");
  46. System.out.println(order.getOrderNumber());
  47. System.out.println(order.getCustomer().getName());
  48. System.out.println("***************************");
  49. }
  50. }
  51. }

  7.生成的xml文件

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <CHMart name="CHMart">
  3. <number>100000</number>
  4. <describer>EveryThing</describer>
  5. <address state="China">
  6. <province>ZheJiang</province>
  7. <city>HangZhou</city>
  8. <street>XiHuRoad</street>
  9. <zip>310000</zip>
  10. </address>
  11. <orders>
  12. <order orderNumber="LH59800">
  13. <shopName>Mart</shopName>
  14. <price>80</price>
  15. <amount>1</amount>
  16. <purDate>2012-03-25 12:57:23</purDate>
  17. <customer name="David">
  18. <gender>male</gender>
  19. <phoneNo>13699991000</phoneNo>
  20. <address state="China">
  21. <province>JiangSu</province>
  22. <city>NanJing</city>
  23. <street>ZhongYangLu</street>
  24. <zip>210000</zip>
  25. </address>
  26. </customer>
  27. </order>
  28. <order orderNumber="LH59900">
  29. <shopName>Mart</shopName>
  30. <price>60</price>
  31. <amount>1</amount>
  32. <purDate>2012-03-25 12:57:23</purDate>
  33. <customer name="Jim">
  34. <gender>male</gender>
  35. <phoneNo>13699990000</phoneNo>
  36. <address state="China">
  37. <province>ShangHai</province>
  38. <city>ShangHai</city>
  39. <street>Huang</street>
  40. <zip>200000</zip>
  41. </address>
  42. </customer>
  43. </order>
  44. </orders>
  45. </CHMart>

  以上是以一个简单的商店订单模型作为示例。

JAXB--学习2的更多相关文章

  1. JAXB学习(一):概述

    pre.XML { background-color: rgba(255, 204, 204, 1); padding-left: 25px } JAXB是 Java Architecture for ...

  2. java JAXB 学习

    JAXB(Java Architecture for XML Binding)是JDK的一部分,用于Object <-> XML的转换(有点类似于.NET中的XML序列化). 1.创建XS ...

  3. JAXB学习(二): 对JAXB支持的主要注解的说明

    我们在上一篇中对JAXB有了一个大致的认识,现在我们来了解JAXB的一些主要注解. 顶层元素:XmlRootElement 表示整个XML文档的类应该使用XmlRootElement修饰,其实就像之前 ...

  4. XML学习记录1-复习SAX,DOM和JAXB

    对xml文档的解析常见的有JDK中的sax,dom,jaxb,stax和JAVA类库JDOM和DOM4J,下面先说说前三个. Java中解析XML的工具很多,像JDOM,DOM4J等,但Java标准库 ...

  5. JavaEE学习之JAXB

    一.前言 JAXB——Java Architecture for XML Binding,是一项可以根据XML Schema产生Java类的技术.JAXB提供将XML实例文档反向生成Java对象树的方 ...

  6. 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  7. [Java] JAVA程序员您需要学习的25个标准

    (1) 你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该了解UML,尤其是class,object,interaction以 及statediagr ...

  8. jedis访问redis学习笔记

    最近在学习redis,在网上查了些文章,利用他人已有的知识,总结写下了这篇文章,大部分内容还是引用别人的文章内容.经过测试发现spring-data-redis现在有的版本只能支持reids 2.6和 ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  10. 分布式缓存技术redis学习—— 深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

随机推荐

  1. centos6 安装vsftpd

    centos6 安装vsftpd vsftpd一般选择yum安装,以下是安装和配置过程 如果是centos6想要安装的话一般是编译安装 1.安装 yum安装 yum install vsftpd 编译 ...

  2. nginx 2.基本配置

    死磕nginx 2.基本配置 鉴于深入浅出的原理,我们先从一个简单的配置了解nginx的配置 1.一个典型配置 nginx的配置文件默认在nginx安装目录的conf二级目录下面,主配置文件为 ngi ...

  3. GraphViz web版

    http://graphviz-dev.appspot.com/ 用来把dot语言的图画出来,很多地方用dot语言来画图,比如doxygen的类关系,gperftools的分析结果等.

  4. shell编程备忘

    1.脚本存放目录 workspace="$(cd "$(dirname "$0")"; pwd)" 2.输出  其中 command 代表指 ...

  5. mongodb的oplog遇到的问题

    mongodb调整oplog的大小的方法 关闭当前服务器,将服务器以单机模式启动.这是一种方法,还有没有其他方法? mongodb实时扫描oplog,判断记录到哪个地方了 如果扫描oplog的程序挂掉 ...

  6. Html.Action、html.ActionLink与Url.Action的区别

    1.html.ActionLink返回的指向指定controller.指定action的超链接标签<a>标签.如果没有指定controller,则默认为本页面对应的Controller. ...

  7. (转)validateRequest="false"

    由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报错. 解决方案一: 在.aspx文件头中加入这句: <%@ Page validat ...

  8. .net面试总结

    一. hr 为人处事 工作中遇到问题:沟通很重要 离职原因:公司倒闭 二. ISAPI Internet Server Application Program Interface 三. http状态码 ...

  9. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

  10. 装饰(Decorator)模式

    1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.Concre ...