JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

注解介绍
        1)        @XmlType
        2)        @XmlElement
        3)        @XmlRootElement
        4)        @XmlAttribute
        5)        @XmlAccessorType
        6)        @XmlAccessorOrder (不常用)
        7)        @XmlTransient (不常用)
        8)        @XmlJavaTypeAdapter (不常用)

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);
                 }

代码案例:

@XmlRootElement(name = "opDetail") //根节点
class OpDetail {
@XmlElement //节点元素
private RecordInfo recordInfo; public void setRecordInfo(RecordInfo recordInfo) {
this.recordInfo = recordInfo;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
} } class RecordInfo {
@XmlElement
private List<FieldInfo> fieldInfo;
@XmlAttribute //节点属性
private String isNew; public void setIsNew(String isNew) {
this.isNew = isNew;
} public void setFieldInfo(List<FieldInfo> fieldInfo) {
this.fieldInfo = fieldInfo;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
} class FieldInfo {
private String fieldChName;
private String fieldEnName;
private String fieldContent; public String getFieldChName() {
return fieldChName;
} public void setFieldChName(String fieldChName) {
this.fieldChName = fieldChName;
} public String getFieldEnName() {
return fieldEnName;
} public void setFieldEnName(String fieldEnName) {
this.fieldEnName = fieldEnName;
} public String getFieldContent() {
return fieldContent;
} public void setFieldContent(String fieldContent) {
this.fieldContent = fieldContent;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}

main方法测试:

public static void main(String[] args) throws Exception {

        OpDetail opDetail = new OpDetail();
RecordInfo recordInfo = new RecordInfo();
recordInfo.setIsNew("new"); List<FieldInfo> fieldInfo = new ArrayList<>(); FieldInfo f1 = new FieldInfo();
f1.setFieldChName("地区1");
f1.setFieldEnName("area1");
f1.setFieldContent("中国"); FieldInfo f2 = new FieldInfo();
f2.setFieldChName("地区2");
f2.setFieldEnName("area2");
f2.setFieldContent("马来西亚"); fieldInfo.add(f1);
fieldInfo.add(f2); recordInfo.setFieldInfo(fieldInfo);
opDetail.setRecordInfo(recordInfo);
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(OpDetail.class);
Marshaller marshaller = context.createMarshaller();
//设置编码
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
//是否要带 <?xml version="1.0" encoding="GBK" standalone="yes"?>
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(opDetail, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
System.out.println(sw.toString());
/*输出如下:

<?xml version="1.0" encoding="GBK" standalone="yes"?>
<opDetail>
<recordInfo isNew="new">
<fieldInfo>
<fieldChName>地区1</fieldChName>
<fieldContent>中国</fieldContent>
<fieldEnName>area1</fieldEnName>
</fieldInfo>
<fieldInfo>
<fieldChName>地区2</fieldChName>
<fieldContent>马来西亚</fieldContent>
<fieldEnName>area2</fieldEnName>
</fieldInfo>
</recordInfo>
</opDetail>

*/

/*将xml字符串 转换成 java对象 */
// String xml = "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\"?><opDetail><recordInfo><fieldInfo><fieldChName>地区1</fieldChName><fieldContent>中国</fieldContent><fieldEnName>area1</fieldEnName></fieldInfo><fieldInfo><fieldChName>地区2</fieldChName><fieldContent>马来西亚</fieldContent><fieldEnName>area2</fieldEnName></fieldInfo></recordInfo></opDetail>";
// JAXBContext jc = JAXBContext.newInstance(OpDetail.class);
// Unmarshaller u = jc.createUnmarshaller();
// OpDetail o = (OpDetail)u.unmarshal(new StreamSource(new StringReader(xml)));
// System.out.println(o.toString());
/*输出如下:

com.cmcc.open.ss.model.OpDetail@1b74318a[
recordInfo=com.cmcc.open.ss.model.RecordInfo@6960691a[
fieldInfo=[com.cmcc.open.ss.model.FieldInfo@38946002[
fieldChName=地区1
fieldEnName=area1
fieldContent=中国
], com.cmcc.open.ss.model.FieldInfo@152b4053[
fieldChName=地区2
fieldEnName=area2
fieldContent=马来西亚
]]
isNew=<null>
]
*/

    }

总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)的更多相关文章

  1. 使用JDK自带的JAXB进行类和xml的互转

    Classroom.java public class Classroom { private int id; private String name; private int grade; publ ...

  2. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  3. JAVA对象转换JSON

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist); String ...

  4. 启动服务报错:nested exception is java.lang.NoSuchMethodError: org.apache.cxf.common.jaxb.JAXBUtils.closeUnmarshaller(Ljavax/xml/bind/Unmarshaller;)V

    1.启动tomcat时报错:Error creating bean with name 'payInfService': Invocation of init method failed; neste ...

  5. xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml

    xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...

  6. xml与java对象转换 -- XStreamAlias

    @XStreamAlias使用 一. 特点: 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有字段,不需要setter/getter方法 提供序列化接口 ...

  7. Java&Xml教程(十一)JAXB实现XML与Java对象转换

    JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,能够帮助开发者很方便的將XML和Java对象进行相互转换. 本文以一个简单的例 ...

  8. Java&amp;Xml教程(十一)JAXB实现XML与Java对象转换

    JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,可以帮助开发人员非常方便的將XML和Java对象进行相互转换. 本文以一个简单 ...

  9. Spring 整合 Flex (BlazeDS)无法从as对象 到 Java对象转换的异常:org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.util.Date' to required type 'java.sql.Timestamp' for property 'wfsj'; nested exception is java.lang.Ill

    异常信息如下: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value ...

随机推荐

  1. Atitit.二维码功能的设计实践 attilax 总结

    Atitit.二维码功能的设计实践 attilax 总结 1.1. 二维码要实现的功能1 1.2. 现有二维码功能设计不足的地方(待改进)1 1.3. 二维码组件1 1.4. Java版  zxing ...

  2. Atitit. html 使用js显示本地图片的设计方案.doc

    Atitit. html 使用js显示本地图片的设计方案.doc 1.  Local mode  是可以的..web模式走有的不能兰.1 2. IE8.0 显示本地图片 img.src=本地图片路径无 ...

  3. shader 编程入门(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  4. 《The Joy of X》

    来到园子已经几个月了,平时也就看看新闻.招聘信息,偶尔也会看看技术文章.作为一名非计算机专业的学生,我深深地被技术的魅力所吸引.就在半个多月前,我开通了自己的博客,以便记录自己的成长经历,也能与园子里 ...

  5. CodeForces 584D Dima and Lisa

    1e9 以内的判断一个数是否是素数,可以直接朴素的暴力.   这倒题除了考虑1e9以内的素数的判断,还有一个歌德巴赫猜想:任意一个奇数都可一分解为三个素数的和. 第三个结论:素数是密集的,1e9以内, ...

  6. JAVA设置HttpOnly Cookies

    HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...

  7. hdu6058 Kanade's sum 区间第k大

    /** 题目:Kanade's sum 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6058 题意:给定[1,n]的排列,定义f(l,r,k)表示区间[l ...

  8. HDFS的HA机制

    传统的HDFS机制如下图所示: 也就是存在一个NameNode,一个SecondaryNameNode,然后若干个DataNode.这样的机制虽然元数据的可靠性得到了保证(靠edits,fsimage ...

  9. 关于selenium IDE找不到元素bug

    使用 selenium IDE 录制脚本,经常会发生 这样一种错误. 页面上,明明存在这个元素,就是找不到. 其实原理很简单   , 按钮 点击,没有时间延迟,但是页面加载,需要一段时间. 页面元素还 ...

  10. 关于MongoDB最大连接数的查看与修改

    一. MongoDB连接数 在Linux平台下,无论是64位或者32位的MongoDB默认最大连接数都是819,WIN平台不知道,估计也没有人在 WIN平台下使用MongoDB做生产环境 [root@ ...