先说下这个的背景吧,前些日子,有个以前的小同事说刚接触webservice,想解析下xml,记得我学的时候还是dom4j,sax的解析方式,最近看别人的代码用的jaxb的方式,觉得注解起来很简练,所以就拿jaxb试着写了一个,并一起总结一下,当做备忘录吧。

先看下xml的格式吧,如下

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mo version="1.0.0">
<head>
<businessType>PLANING_RECEIPTS</businessType>
</head>
<body>
<planingReceiptsInfo>
<manSign>
<companyCode>发送方海关十位数编码</companyCode>
<businessNo>业务编码</businessNo>
<businessType>业务类型</businessType>
<declareType>申报类型</declareType>
<note>备注</note>
</manSign>
<manPlaningReceipts>
<planingReceiptsId>计划入库单编号</planingReceiptsId>
<manualId>账册编号</manualId>
<customsCode>关区代码</customsCode>
<companyCode>企业海关十位编码</companyCode>
<companyName>企业名称</companyName>
<grossWeight>毛重</grossWeight>
<netWeight>净重</netWeight>
<amount>件数</amount>
<wrapType>包装种类</wrapType>
<port>申报关区</port>
<providerCodep>厂商编码</providerCodep>
<type>业务类别</type>
</manPlaningReceipts>
<manPlaningReceiptsDetailList>
<manPlaningReceiptsDetail>
<planingReceiptsId>6</planingReceiptsId>
<sourceNo>8</sourceNo>
<itemNo>4</itemNo>
<itemType>5</itemType>
<goodsNo>3</goodsNo>
<declareAmount>2</declareAmount>
<totalPrice>9</totalPrice>
<price>7</price>
<countryCode>1</countryCode>
</manPlaningReceiptsDetail>
<manPlaningReceiptsDetail>
<planingReceiptsId>6</planingReceiptsId>
<sourceNo>8</sourceNo>
<itemNo>4</itemNo>
<itemType>5</itemType>
<goodsNo>3</goodsNo>
<declareAmount>2</declareAmount>
<totalPrice>9</totalPrice>
<price>7</price>
<countryCode>1</countryCode>
</manPlaningReceiptsDetail>
</manPlaningReceiptsDetailList>
</planingReceiptsInfo>
</body>
</mo>

java解析类,如下

public class TestClass {
public static void main(String[] args) {
StringBuffer buffer = null;
JAXBContext jaxbContext;
try {
//读入xml文件流
InputStream is = new FileInputStream(new File("E:\\github\\myproject\\myweb\\src\\main\\resources\\test.xml"));
BufferedReader in = new BufferedReader(new InputStreamReader(is));
buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
} //加载映射bean类
jaxbContext = JAXBContext.newInstance(BaseBean.class);
//创建解析
Unmarshaller um = jaxbContext.createUnmarshaller();
StreamSource streamSource = new StreamSource(new StringReader(buffer.toString()));
BaseBean root = (BaseBean) um.unmarshal(streamSource);
System.out.println(root);
} catch (Exception e) {
e.printStackTrace();
}
}
}

其中涉及的javabean相对多一点,就不在这贴了,一样这种日常的东西还是会放到github下,当做自己的积累吧,有兴趣可以down下来看看。

在这里说一下主要的注解,建议没接触过的拿着代码对应着看:

1.XmlRootElement

此注解是一个类级别注解,主要属性为name,看名字也很清楚就是根节点的注解可以指定为根节点的名字

2.XmlType

此注解主要属性为propOrder,可以按指定的顺序生成元素,且指定的顺序必须为全部元素,否则是会报错的

3.XmlElement

    此注解主要属性为name,主要用于改变bean属性与xml映射的名字,此注解的包为

javax.xml.bind.annotation,还有个包有相同的注解,用时需加注意。
lax属性可能也需要,当设置lax为true时,可以把xsi:type, xmlns:xs等相关内容去掉

4.XmlAttribute

    此注解主要属性为name,主要作用是可以把bean的属性映射为xml

5.XmlAccessorType

此注解用于指定由java对象生成xml文件时对java对象属性的访问方式

  • XmlAccessType.FIELD:java对象中的所有成员变量
  • XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量
  • XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量
  • XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素

6.XmlAccessorOrder

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

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

    XmlAccessOrder.UNDEFINED:不排序

7.XmlTransient

   用于标示在由java对象映射xml时,忽略此属性

8.XmlElementWrapper

    表示生成一个包装 XML 表示形式的包装器元素。 此元素主要用于生成一个包装集合的包装器 XML 元素。
注:@XmlElementWrapper仅允许出现在集合属性上。

9.XmlJavaTypeAdapter

常用在转换比较复杂的对象时,用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法

最后把测试上述注解的代码放到这,可以跑一下,就全清楚了,里面还接了放泛型的相关内容

@XmlRootElement(name = "address")
//@XmlType(propOrder = {"name", "code"})
//@XmlAccessorType(XmlAccessType.FIELD)
@XmlAccessorOrder(value = XmlAccessOrder.ALPHABETICAL)
public class TestAddress<T> { /** code */
private int code; /** company */
private String name; /** des */
private String des; private String xxxx; private Date nowDate; private T body;
@XmlElementWrapper(name = "listTest")
@XmlElement(name = "list123")
public List<String> getList() {
return list;
} public void setList(List<String> list) {
this.list = list;
} private List<String> list;
/**
* @return 获取 code属性值
*/
public int getCode() {
return code;
} /**
* @param code 设置 code 属性值为参数值 code
*/
@XmlElement(name = "code1")
public void setCode(int code) {
this.code = code;
} /**
* @return 获取 name属性值
*/
public String getName() {
return name;
} /**
* @param name 设置 name 属性值为参数值 name
*/
public void setName(String name) {
this.name = name;
} @XmlAttribute(name = "desProperty")
public String getDes() {
return des;
} public void setDes(String des) {
this.des = des;
} @XmlTransient
public String getXxxx() {
return xxxx;
} public void setXxxx(String xxxx) {
this.xxxx = xxxx;
} public Date getNowDate() {
return nowDate;
} @XmlJavaTypeAdapter(value = DateAdapter.class)
public void setNowDate(Date nowDate) {
this.nowDate = nowDate;
} public T getBody() {
return body;
} @XmlAnyElement(lax=true)
public void setBody(T t) {
this.body = t;
} @Override
public String toString() {
return "TestAddress{" +
"code=" + code +
", name='" + name + '\'' +
", des='" + des + '\'' +
", xxxx='" + xxxx + '\'' +
", nowDate=" + nowDate +
", body=" + body +
", list=" + list +
'}';
}
}
@XmlRootElement(name = "body")
@XmlAccessorType(XmlAccessType.FIELD)
public class JaxbBean {
private String bean1;
private String bean2; public String getBean1() {
return bean1;
} public void setBean1(String bean1) {
this.bean1 = bean1;
} public String getBean2() {
return bean2;
} public void setBean2(String bean2) {
this.bean2 = bean2;
} @Override
public String toString() {
return "JaxbBean{" +
"bean1='" + bean1 + '\'' +
", bean2='" + bean2 + '\'' +
'}';
}
}
public class OXMapper {

    /** Marshaller */
private Marshaller marshaller; /** Unmarshaller */
private Unmarshaller unmarshaller; /**
* @return 获取 marshaller属性值
*/
public Marshaller getMarshaller() {
return marshaller;
} /**
* @param marshaller 设置 marshaller 属性值为参数值 marshaller
*/
public void setMarshaller(Marshaller marshaller) {
this.marshaller = marshaller;
} /**
* @return 获取 unmarshaller属性值
*/
public Unmarshaller getUnmarshaller() {
return unmarshaller;
} /**
* @param unmarshaller 设置 unmarshaller 属性值为参数值 unmarshaller
*/
public void setUnmarshaller(Unmarshaller unmarshaller) {
this.unmarshaller = unmarshaller;
} /**
* 将对象转换输出为xml文件
*
* @param object object 对象
* @param filename filename 文件名
* @throws IOException IOException IO异常
*/
public void writeObjectToXml(Object object, String filename) throws IOException {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filename);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(object, new StreamResult(fos));
} catch (JAXBException e) {
//LOG.error("Xml-Serialization failed due to an XmlMappingException.", e);
} catch (IOException e) {
//LOG.error("Xml-Serialization failed due to an IOException.", e);
} finally {
if (fos != null) {
fos.close();
}
}
} /**
* 将xml文件转换成java对象
*
* @param filename filename 文件名称
* @return Object 转换后的java对象
* @throws IOException IOException IO异常
* @throws JAXBException JAXBException JAXB异常
*/
public Object readObjectFromXml(String filename) throws IOException, JAXBException {
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
return unmarshaller.unmarshal(new StreamSource(fis));
} catch (IOException e) {
// LOG.error("Xml-Deserialization failed due to an IOException.", e);
} finally {
if (fis != null) {
fis.close();
}
}
return null;
} /**
* 测试用例
*
* @param args 传入参数
* @throws IOException IOException
* @throws JAXBException JAXBException
*/
public static void main(String[] args) throws IOException, JAXBException {
JaxbBean jaxbBean = new JaxbBean();
jaxbBean.setBean1("124");
jaxbBean.setBean2("456");
// TestAddress<JaxbBean> address = new TestAddress<JaxbBean>();
address.setCode(58888);
address.setName("深圳市福田区莲花路2075号香丽大厦首层");
address.setDes("测试属性");
address.setXxxx("xxxx");
address.setNowDate(new Date());
List<String> list1 = new ArrayList<String>();
list1.add("test1");
list1.add("test2");
address.setList(list1);
address.setBody(jaxbBean); JAXBContext objJaxbContext = JAXBContext.newInstance(address.getClass(), jaxbBean.getClass());
Marshaller objMarshaller = objJaxbContext.createMarshaller();
OXMapper oxMapper = new OXMapper();
oxMapper.setMarshaller(objMarshaller);
oxMapper.writeObjectToXml(address, "address.xml");
System.out.println("bean转xml结束"); Unmarshaller objUnmarshaller = objJaxbContext.createUnmarshaller(); oxMapper.setUnmarshaller(objUnmarshaller);
TestAddress objAddress = (TestAddress) oxMapper.readObjectFromXml("address.xml");
System.out.println(objAddress);
//System.out.println(ReflectionToStringBuilder.toString(objAddress, ToStringStyle.MULTI_LINE_STYLE));
}
}

参考

1.http://my.oschina.net/zzx0421/blog/98186

2.http://www.aiuxian.com/article/p-3149775.html

3.http://suo.iteye.com/blog/1233603

Jaxb解析xml准换为javabean的更多相关文章

  1. JAXB解析xml 的注解说明

      1.将 xml 文件中的各个节点和属性信息创建对应的Java模型 2.在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示@XmlRootElement   将一个Java类映射 ...

  2. jaxb解析xml工具类

    [quote]jaxb jdk 自带的解析xml的一种方式支持,只需要用注解对javabean进行数据绑定[/quote] package com.nnk.flowrecharge.common;im ...

  3. 使用JAXB解析xml文件(一)

      1.java中解析xml的几种方式 1.1 JDK原生dom形式 原理:一次性把xml读入内存,在内存中构建成树形结构.优点:对节点操作方便,缺点:需要大量的内存空间,浪费资源 1.2 SAX形式 ...

  4. JAXB解析XML为对象

    JAXB支持注解将XML转化为对象,具体看一个简单的例子: <?xml version="1.0" encoding="utf-8"?> <A ...

  5. 使用JAXB解析xml文件(二)

    前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解 1.@XmlRootElement 用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccess ...

  6. JAVA DOM4j解析XML数据到自定义javabean

    我们获取xml中的数据,一般以面向对象的思想去处理这些数据.因此,我们需要自定义类来封装解析出来的数据,以方便我们操作这些数据. 自定义的java类,称为javabean. 自定义Contact类代码 ...

  7. JAXB解析xml

    废话不多说,直接上代码 核心类: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java. ...

  8. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  9. webservice04#对象与xml转换-jaxb#Stax解析xml#新建修改xml

    1,Student类 package com.yangw.xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement / ...

随机推荐

  1. tengine-2.1.0 + GraphicsMagick-1.3.20

    export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0/./configure --prefix ...

  2. 配置 Sublime Text 用 Node.js 执行 JavaScript 程序

    1. 首先到 nodejs.org 下载 Node.js 安装包并安装. 2. 打开 Sublime Text 2 编辑器.选择菜单 Tools --> Build System --> ...

  3. 基于SWFUpload的angular上传组件

    回顾 由于工作内容比较多,特别是架构方面,需要耗费很多的时间调整.重构,因此很久没有写文章了. 话就不多说了,直接进入主题. 实现 首先分析一下SWFUpload初始化的时候,需要传入当前触发上传的元 ...

  4. 实例演示 kino.razor (前端 Javascript 模板工具,Razor 风格)的使用

    前言 对于习惯了 ASP.NET MVC Razor 模板引擎的人来说,比如我,一直在寻找前端 Javascript 端的 Razor 模板工具.这之前,我也了解到很多Javascript 端的模板工 ...

  5. Knockout 新版应用开发教程之"text"绑定

    目的 DOM元素显示文本的值是你传递的参数,前提是text先绑定到该元素上 典型的常用元素 <span>或者<em>习惯性的用来显示文本,但是在技术上来说你可以用任何元素的. ...

  6. ADT-bundle(Android Development Tools)环境配置

    Android开发环境有两套比较主流的:ADT-bundle和Android Studio,前者是Eclipse插件的形式进行开发,后者是Android的官方IDE. ADT环境的配置与调试:(1)安 ...

  7. Python单元测试框架之pytest -- 生成测试报告

    继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...

  8. 【HTML5】Canvas 实现放大镜效果

    图片放大镜 效果 在线演示    源码 原理 首先选择图片的一块区域,然后将这块区域放大,然后再绘制到原先的图片上,保证两块区域的中心点一致, 如下图所示: 初始化 <canvas id=&qu ...

  9. IOS开发UI基础之UIButton

    什么是按钮?

  10. css命名那些事儿

    根据目前彩票行业的公司进行css命名的层级解析,此次选择了网易彩票,QQ彩票,澳客彩票网,中国竞彩网,500.com,彩票365,新浪彩票,新浪爱彩,凤凰彩票,淘宝彩票的首页进行css命名的采集和分析 ...