Jaxb解析xml准换为javabean
先说下这个的背景吧,前些日子,有个以前的小同事说刚接触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的更多相关文章
- JAXB解析xml 的注解说明
1.将 xml 文件中的各个节点和属性信息创建对应的Java模型 2.在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示@XmlRootElement 将一个Java类映射 ...
- jaxb解析xml工具类
[quote]jaxb jdk 自带的解析xml的一种方式支持,只需要用注解对javabean进行数据绑定[/quote] package com.nnk.flowrecharge.common;im ...
- 使用JAXB解析xml文件(一)
1.java中解析xml的几种方式 1.1 JDK原生dom形式 原理:一次性把xml读入内存,在内存中构建成树形结构.优点:对节点操作方便,缺点:需要大量的内存空间,浪费资源 1.2 SAX形式 ...
- JAXB解析XML为对象
JAXB支持注解将XML转化为对象,具体看一个简单的例子: <?xml version="1.0" encoding="utf-8"?> <A ...
- 使用JAXB解析xml文件(二)
前面一章简单演示了JAXB的用法,这个章节主要梳理一下JAXB常见的几个注解 1.@XmlRootElement 用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccess ...
- JAVA DOM4j解析XML数据到自定义javabean
我们获取xml中的数据,一般以面向对象的思想去处理这些数据.因此,我们需要自定义类来封装解析出来的数据,以方便我们操作这些数据. 自定义的java类,称为javabean. 自定义Contact类代码 ...
- JAXB解析xml
废话不多说,直接上代码 核心类: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java. ...
- JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)
1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...
- webservice04#对象与xml转换-jaxb#Stax解析xml#新建修改xml
1,Student类 package com.yangw.xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement / ...
随机推荐
- 使用aspose.cell导出excel需要注意什么?
1.如果导出的数据源是汇总出来的,最好方法是将数据源放到缓存里面,当基本数据源变化的时候,在改变数据2.使用模板导出EXCEL,这样很多样式可以在模板文件里面直接设置,例如:默认打开页签,让列头固定3 ...
- Selenium Grid 学习笔记
Selenium Grid 学习笔记http://www.docin.com/p-765680298.html
- POJ 2078 Matrix
Matrix Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3239 Accepted: 1680 Descriptio ...
- failed jobs because of past close date,关工单报错
今天会计反映关不了工单.我们公司关工单的程序是自己开发的,可以整批关.报如下错误.我试着用Standad程序关,可以.看来应该是我们开发的程序有问题.后来发现,是抛到WIP_DJ_CLOSE_TEMP ...
- C++:不同类型的指针的本质与差异
转自:http://blog.csdn.net/richerg85/article/details/10076365 指针的类型(The Type of a Pointer) 一 ...
- android手势创建及识别
使用一些浏览器或者输入法应用时会有一些手势操作,还可以自定义手势.这些神奇的操作是怎么做的呢?这一篇重点记录手势的识别和创建.这篇的内容使用到的是android.gesture包,具体的例子参考的是S ...
- 组合模式及C++实现
组合模式 组合模式,是为了解决整体和部分的一致对待的问题而产生的,要求这个整体与部分有一致的操作或行为.部分和整体都继承与一个公共的抽象类,这样,外部使用它们时是一致的,不用管是整体还是部分,使用一个 ...
- ArcGIS如何将表连接到空间数据上
当我们有一些空间数据和一些业务数据(表),希望把业务数据和空间数据连接起来时,可以采用ArcGIS Desktop进行操作.本文将介绍如何在ArcGIS Destop中将表和空间数据关联起来. Arc ...
- HDU4550+贪心
/* 贪心 先挑出最小的Mm,然后在Mm左侧的按情况考虑,右侧的按顺序排列. */ #include<stdio.h> #include<string.h> #include& ...
- cmd 窗口配置mysql数据库
1.运行-cmd 进入command 窗口 首先cd 到mysql目录下的bin的 路运行-cmd 进入command 窗口 首先cd 到mysql目录下的bin的路径.注意cd D盘时直接输入D:就 ...