java关于xml的注解: JAXB(自动生成xml文件)
来源:互联网 发布:迪奥布兰度 知乎 编辑:程序博客网 时间:2024/05/16 12:42
介绍:
Java和xml的互相转换, 依靠强大的JAXBContext可以轻松实现。
JAXBContext是jdk自带的一个工具,包路径:javax.xml.bind.JAXBContext。
关于JAXB:
JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标志可以转换为JSON对象的JAVA类。JAXB允许JAVA人员将JAVA类映射为XML表示方式,常用的注解包括:@XmlRootElement,@XmlElement等等。
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
Java SE中的JAXB
JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。
JDK中JAXB相关的重要Class和Interface:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
JDK中JAXB相关的重要Annotation:
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
其他:
对于要序列化(marshal)为XML的Java类,绝不能把成员变量声明为public,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。
对于JAXB相关的重要Annotation的声明,如@Xml…..,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。
示例:
类文件注解:@XmlRootElement不可缺少
Student 实体类
@XmlRootElement public class Student { private String name; private String width; private String height; private int age; public Student(String name, String width, String height, int age) { super(); this.name = name; this.width = width; this.height = height; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWidth() { return width; } public void setWidth(String width) { this.width = width; } public String getHeight() { return height; } public void setHeight(String height) { this.height = height; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student() { super(); } }
JavaToXml:
@Test public void test01(){ try { JAXBContext jc = JAXBContext.newInstance(Student.class); Marshaller ms = jc.createMarshaller(); Student st = new Student("zhang", "w", "h", 11); ms.marshal(st, System.out); } catch (JAXBException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
XmlToJava:
@Test public void test02() throws JAXBException{ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><student><age>11</age><height>h</height><name>zhang</name><width>w</width></student>"; JAXBContext jc = JAXBContext.newInstance(Student.class); Unmarshaller unmar = jc.createUnmarshaller(); Student stu = (Student) unmar.unmarshal(new StringReader(xml)); System.out.println(stu.getName()); }
其实Marshal 和 UnMarshal的过程并不复杂,只需要从JAXBContext中获得Marshaller或Unmarshaller对象,就可以让JAXB帮我们来进行转换了。我们需要操作的主要内容是定义一个规则,告诉JAXB如何将一个类、按照什么样的格式转换为XML,下面是JAXB中主要的一些注解。
常用annotation使用说明
1.@XmlType
@XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:
@XmlType(name = "basicStruct", propOrder = { "intValue", "stringArray", "stringValue")
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。
参数:
propOrder 指定映射XML时的节点顺序
factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
factoryMethod 指定工厂类的工厂方法
name 定义XML Schema中type的名称
namespace 指定Schema中的命名空间
2.@XmlElement
@XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:
@XmlElement(name="Address") private String yourAddress;
当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。
参数:
defaultValue 指定节点默认值
name 指定节点名称
namespace 指定节点命名空间
required 是否必须(默认为false)
nillable 该字段是否包含 nillable=”true” 属性(默认为false)
type 定义该字段或属性的关联类型
3.@XmlRootElement
@XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:
@XmlType@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElementpublic class Address {}
参数:
name 定义这个根节点的名称
namespace 定义这个根节点命名空间
4.@XmlAttribute
@XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。如:
@XmlAttribute(name="Country")private String state;
参数:
name 指定属性名称
namespace 指定属性命名空间
required 是否必须(默认为false)
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 定义某一字段或属性不需要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。注意:当某一字段或属性添加了@XmlElement,那么该字段或属性的get/set方法必须使用@XmlTransient, 否则将会报异常:1 counts of IllegalAnnotationExceptions
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); }
9.@XmlElementWrapper
@XmlElementWrapper 为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为
<items>...</items><items>...</items>
这种形式,此注解可将这个元素进行包装,如:
@XmlElementWrapper(name="items")@XmlElement(name="item")public List items;
将会生成这样的XML样式:
<items> <item>...</item> <item>...</item></items>
10.@XmlSchema
@XmlSchema这个注解需放在package-info.java文件中。
jaxb编码:
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();InputStreamReader reader=new InputStreamReader(inputStream,"GBK"); //在此修改编码return unmarshaller.unmarshal(reader);
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- java关于xml的注解: JAXB(自动生成xml文件)
- JAXB注解 java 关于xml的注解,自动生成xml文件
- JAXB注解 java 关于xml的注解,自动生成xml文件
- JAXB注解 java 关于xml的注解,自动生成xml文件
- JAXB注解 java 关于xml的注解,自动生成xml文件
- java 关于xml的注解,自动生成xml文件 - @XML***
- java 关于xml的注解,自动生成xml文件 - @XML***
- java 关于xml的注解,自动生成xml文件 - @XML***
- java 关于xml的注解,自动生成xml文件 - @XML
- java 关于xml的注解,自动生成xml文件 - @XML***
- Java JAXB 生成xml
- JAXB生成XML文件的格式化
- 变量
- hdu 5072 Coprime
- 初学C++
- ceph存储 ceph Bluestore的架构
- 对于修改TabBar和NavigationBar全局背景颜色、字体颜色的两个方法
- java关于xml的注解: JAXB(自动生成xml文件)
- Collection总结
- @Responsebody与@RequestBody精简详解
- 处理手势冲突和错乱的一点经验
- 第一天:用Struts实现helloWorld
- 观察者模式——对象行为型模式
- Windows下配置nginx+php(wnmp)
- js基础:数据类型,变量命名规范
- C++学习笔记1 struct和typedef struct