当前位置:   article > 正文

jaxb实现javabean和xml间互相转换_jaxb xmlseealso

jaxb xmlseealso

 

JAXB(Java Architecture for XML Binding) 

一、code

1.java bean->xml

  1. @Test
  2. public void marshalTest() {
  3. try {
  4. JAXBContext jContext = JAXBContext.newInstance(User.class);
  5. Marshaller marshaller = jContext.createMarshaller();
  6. Pet pet = new Pet("dog","小哈");
  7. Book aBook = new Book("平凡的世界", 20);
  8. Book bBook = new Book("明晓溪",15);
  9. List<Book> books = new ArrayList<Book>();
  10. books.add(aBook);
  11. books.add(bBook);
  12. User user = new User("张三","女", 20, new Date(), null, pet, books);
  13. //设置生成的xml的编码
  14. marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
  15. //设置生成的xml内容是否format,否的话是显示一行
  16. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  17. //是否省略头部声明信息,默认false
  18. marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
  19. //直接输出文件
  20. marshaller.marshal(user, new File("a.xml"));
  21. OutputStream out = new ByteArrayOutputStream();
  22. //输出字节流
  23. marshaller.marshal(user, out);
  24. System.out.println("========"+out.toString());
  25. } catch (JAXBException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29. }

JDK1.7及之后做了更多封装,更加简单: 

JAXB.marshal(user, new File("b.xml"));

2.xml->javabean

  1. @Test
  2. public void unmarshallTest() {
  3. try {
  4. JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
  5. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  6. User user = (User) unmarshaller.unmarshal(new File("a.xml"));
  7. System.out.println(user.toString());
  8. } catch (JAXBException e) {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. }
  12. }

1.7及之后:

User user2 = JAXB.unmarshal(new File("b.xml"), User.class);

二、重要注解

1.@XmlRootElement(必要)

  1. //根元素默认类名首字母小写。设置name后,map到name。设置namespace后,生成到的根元素-><ns2:person xmlns:ns2="com">
  2. @XmlRootElement(name="person",namespace="com")
  3. public class User{

2.@XmlElement

  1. @XmlElement(name="name1")//此注解用于属性与xml元素到map。可加在属性上(private的会报错),或get/set方法上。
  2. @XmlElement(name=""namespace="com1")//设置后,根元素-><ns3:person xmlns:ns2="com1" xmlns:ns3="com">,对应元素-><ns2:sex></ns2:sex>
  3. @XmlElement(nillable=true)//默认null值不显示在xml中,此设置为true,则null值也显示-><other xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
  4. @XmlElement(required=true)?????
  5. @XmlElement(defaultValue="others")????

3.@XmlAttribute

加载类属性上,默认是设置root的属性,可设置namepace和required属性等

4.@XmlValue 

用于映射直接应用XML元素的文本内容的

5.@XmlType

用于定义在类上,表示该类对应于XML的一个复杂类型对象。默认情况下不加XmlType时我们的类也会自动的被映射为XML的一个复杂类型对象。使用@XmlType时主要是希望通过它的propOrder属性指定生成的XML的属性排列顺序,不指定顺序时默认生成的XML的节点/属性的顺序是不确定的

如:@XmlType(propOrder= { "name", "age"})

6.@XmlAccessorOrder

也是指定Java对象生成的XML元素/属性的顺序的。通过它指定的顺序的可选值有:

          XmlAccessOrder.ALPHABETICAL:按照字母的自然顺序进行升序排列。

          XmlAccessOrder.UNDEFINED:未定义,即顺序不固定,这个是默认值。

除了可以定义在类上,还可以定义在包上,定义在包上表示在该包中所有的类型对应的XML的默认排序规则。定义在包中时需要在对应的包下面建立package-info.java文件,然后将该注解加在package-info.java中的package声明上。如下我们就在com.xxx.jaxb的package-info.java中指定了com.xxx.jaxb包中的类对应的XML元素顺序默认按照字母升序排列。

  1. @javax.xml.bind.annotation.XmlAccessorOrder(javax.xml.bind.annotation.XmlAccessOrder.ALPHABETICAL)
  2. package com.xxx.jaxb;

7.@XmlTransient

用于在进行Java对象和XML相互转换时定义需要忽略的Java属性。

8.@XmlAccessorType

可以标注在Class和package上,标注在package上时需要标注在对应的package-info.java文件的package上。

作用:指定Java对象和XML相互转换时Java对象属性访问方式,即哪些属性会与XML进行映射。它的可选值是由XmlAccessType类型的枚举指定。一共四种:

  • FIELD:会自动把非static、非transient和非XmlTransient标注的属性与XML进行映射,哪怕对应的属性是私有的。对应的get方法只有在使用了XmlElement等相关注解的情况下才会与XML映射。
  • PROPERTY: 会自动把get/set配对的方法与XML进行映射。而使用类似于XmlElement这样的注解标注的get方法即使没有对应的set方法也会与XML进行映射。
  • PUBLIC_MEMBER: 这是没有指定XmlAccessorType时的默认映射方式。没有使用XmlTransient标注的public类型的get/set方法对或没有使用transient修饰且没有使用XmlTransient注解标注的public类型的属性将自动与XML进行映射;其它属性或get/set方法如果使用了类似于XmlElement之类的注解进行标注也会自动与XML进行映射。
  • NONE: 不自动将属性和get/set方法与XML进行映射。除非在对应的属性或get/set方法上使用了类似于XmlElement之类的JAXB注解进行标注。

 

9.@XmlElementWrapper

用于进行集合类型的属性映射时,在XML元素的外层再多包一层元素。可以指定name属性外,还可以指定namespace、required和nilable属性。

  1. @XmlRootElement
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. public class Root {
  4. private List<String> values = Arrays.asList("A", "B", "C");
  5. }

生成的xml

  1. <root>
  2. <values>A</values>
  3. <values>B</values>
  4. <values>C</values>
  5. </root>

设置xmlElementWrapper:

  1. @XmlRootElement
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. public class Root {
  4. @XmlElementWrapper
  5. @XmlElement(name="value")
  6. private List<String> values = Arrays.asList("A", "B", "C");

包裹后的xml

  1. <root>
  2. <items>
  3. <value>A</value>
  4. <value>B</value>
  5. <value>C</value>
  6. </items>
  7. </root>

10. @XmlJavaTypeAdapter

用于自定义javabean和xml间字段转换的规则,比如date转为字符串,转为什么格式的等。

使用XmlJavaTypeAdapter时需要通过value属性指定一个XmlAdapter类,表示对应的适配器类。XmlAdapter是一个抽象类。其中定义了两个方法,marshal和unmarshal,marshal方法用于适配从Java到XML,unmarshal方法用于适配从XML到Java。比如需要把java.util.Date类型转换为yyyy-MM-dd格式的字符串可以定义如下适配器。

  1. //适配器定义:
  2. public class DateAdapter extends XmlAdapter<String, java.util.Date> {
  3. private static final String PATTERN = "yyyy-MM-dd";
  4. @Override
  5. public Date unmarshal(String v) throws Exception {
  6. if (v != null) {
  7. return new SimpleDateFormat(PATTERN).parse(v);
  8. }
  9. return null;
  10. }
  11. @Override
  12. public String marshal(Date v) throws Exception {
  13. if (v != null) {
  14. return new SimpleDateFormat(PATTERN).format(v);
  15. }
  16. return null;
  17. }
  18. }
  19. //适配器使用:
  20. @XmlRootElement
  21. @XmlAccessorType(XmlAccessType.FIELD)
  22. public class Root {
  23. @XmlJavaTypeAdapter(DateAdapter.class)//value=DateAdapter.class
  24. private Date date = new Date();
  25. }

xml输出:

  1. <root>
  2. <date>2017-11-19</date>
  3. </root>

XmlJavaTypeAdapter也可以标注在Java类上,表示遇到对应的类型时就使用指定的适配器

XmlJavaTypeAdapter也可以标注在package上,标注在package上时必须指定type类型,表示在指定的包中遇到type属性指定的类型时就使用value属性对应的适配器。下面的代码表示在com.xxx.jaxb中遇到java.util.Date类型就使用DateAdapter适配器。

  1. @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=DateAdapter.class, type=java.util.Date.class)
  2. package com.xxx.jaxb;

11.@XmlJavaTypeAdapters

只能标注在package上,用于定义多个XmlJavaTypeAdapters

  1. @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
  2. @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = DateAdapter.class, type = java.util.Date.class),
  3. @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value = MoneyAdapter.class, type = java.math.BigDecimal.class) })
  4. package com.xxx.jaxb;

12.@XmlAnyElement

用于不固定节点,如果有很多,可以用list<Object>来接收,默认创建的都是org.w3c.dom.Element类型的对象。动态节点有些是固定类型,可以设置@XmlAnyElement时指定其lax属性为true

  1. @XmlRootElement
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. public class Root {
  4. public String no;
  5. public String name;
  6. @XmlAnyElement
  7. public List<Object> others;
  8. }
  9. @XmlRootElement
  10. @XmlAccessorType(XmlAccessType.FIELD)
  11. public class Root {
  12. public String no;
  13. public String name;
  14. @XmlAnyElement(lax=true)
  15. public List<Object> others;
  16. @XmlRootElement(name="d1")
  17. @XmlAccessorType(XmlAccessType.FIELD)
  18. public static class D1 {
  19. @XmlValue
  20. public String value;
  21. }
  22. }

这样进行了unmarshal之后对应的others属性中就包含了一个D1类型的对象

  1. @Test
  2. public void testBasicUnmarshal() throws Exception {
  3. JAXBContext jaxbContext = JAXBContext.newInstance(Root.class, D1.class);
  4. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  5. Root root = (Root) unmarshaller.unmarshal(this.getClass().getClassLoader().getResourceAsStream("jaxb/dynamic.xml"));
  6. D1 d1 = null;
  7. for (Object obj : root.others) {
  8. if (obj instanceof D1) {
  9. d1 = (D1) obj;
  10. }
  11. }
  12. Assert.assertNotNull(d1);
  13. }

13.@XmlElements

用于定义多个@XmlElement的,标注在集合类型的属性上以根据集合元素类型给定不同的元素名称。

  1. @XmlRootElement
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. public class Root {
  4. @XmlElementWrapper(name = "objs")
  5. @XmlElements({ @XmlElement(name = "string", type = String.class), @XmlElement(name = "int", type = Integer.class),
  6. @XmlElement(name = "boolean", type = Boolean.class), @XmlElement(name = "long", type = Long.class) })
  7. public List<Object> objs = Arrays.asList("A", 1, true, 1L);
  8. }

14.更多

如XmlAnyAttribute,XmlElementRef,XmlElementRefs,XmlRegistry和XmlElementDecl,XmlID和XmlIDRef,XmlList,XmlSeeAlso,XmlEnum和XmlEnumValue。

http://doc.okbase.net/234390216/archive/296027.html

 

JAXB缺省的数据类型绑定

XML Schema类型

Java数据类型

xsd:string

java.lang.String

xsd:positiveInteger

java.math.BigInteger

xsd:int

int

xsd:long

long

xsd:short

short

xsd:decimal

java.math.BigDecimal

xsd:float

float

xsd:double

double

xsd:boolean

boolean

xsd:byte

byte

xsd:QName

javax.xml.namespace.QName

xsd:dateTime

javax.xml.datatype.XMLGregorianCalendar

xsd:base64Binary

byte[]

xsd:hexBinary

byte[]

xsd:unsignedInt

long

xsd:unsignedShort

int

xsd:unsignedByte

short

xsd:time

javax.xml.datatype.XMLGregorianCalendar

xsd:date

javax.xml.datatype.XMLGregorianCalendar

xsd:g

javax.xml.datatype.XMLGregorianCalendar

xsd:anySimpleType

java.lang.Object

xsd:anySimpleType

java.lang.String

xsd:duration

javax.xml.datatype.Duration

xsd:NOTATION

javax.xml.namespace.QName

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/421650
推荐阅读
相关标签
  

闽ICP备14008679号