Xstream生成和解析xm和JAXB生成和解析xml的方法。

一,Xstream

Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar

1.Xstream简介;

使用限制: JDK版本不能<1.5. 
虽然预处理注解是安全的,但自动侦查注解可能发生竞争条件.

特点: 
简化的API; 
无映射文件; 
高性能,低内存占用; 
整洁的XML; 
不需要修改对象;支持内部私有字段,不需要setter/getter方法,final字段;非公有类,内部类;类不需要默认构造器,完全对象图支持.维护对象引用计数,循环引用. i 
提供序列化接口; 
自定义转换类型策略; 
详细的错误诊断; 
快速输出格式;当前支持 JSON 和 morphing.

使用场景 
Transport 转换 
Persistence 持久化对象 
Configuration 配置 
Unit Tests 单元测

隐式集合 
当我们使用集合类时不想显示集合,只显示里面的元素即可. 
使用隐式集合前: 
<list> 
 <element /> 
 <element /> 
<list>

使用隐式集合: 
xstream.addImplicitCollection(Person.class, "list");

使用隐式集合后: 
 <element /> 
 <element />

 2.Xstream注解常用知识: 
@XStreamAlias("message") 别名注解  
作用目标: 类,字段  
@XStreamImplicit 隐式集合  
@XStreamImplicit(itemFieldName="part")  
作用目标: 集合字段  
@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器  
作用目标: 对象  
@XStreamAsAttribute 转换成属性  
作用目标: 字段  
@XStreamOmitField 忽略字段  
作用目标: 字段  
Auto-detect Annotations 自动侦查注解   
xstream.autodetectAnnotations(true);  
自动侦查注解与XStream.processAnnotations(Class[] cls)的区别在于性能.自动侦查注解将缓存所有类的类型.

3.案例分析: (1)同一标签下多个同名元素; 
                   (2)同一标签下循环多个对象;

[代码]1.实体类:PersonBean     

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit; /**
*@ClassName:PersonBean
*@author: chenyoulong Email: chen.youlong@payeco.com
*@date :2012-9-28 下午3:10:47
*@Description:TODO
*/
@XStreamAlias("person")
public class PersonBean {
@XStreamAlias("firstName")
private String firstName;
@XStreamAlias("lastName")
private String lastName; @XStreamAlias("telphone")
private PhoneNumber tel;
@XStreamAlias("faxphone")
private PhoneNumber fax; //测试一个标签下有多个同名标签
@XStreamAlias("friends")
private Friends friend; //测试一个标签下循环对象
@XStreamAlias("pets")
private Pets pet; //省略setter和getter
}
[代码]2.实体类:PhoneNumber @XStreamAlias("phoneNumber")
public class PhoneNumber{
@XStreamAlias("code")
private int code;
@XStreamAlias("number")
private String number; //省略setter和getter }
[代码]3.实体类:Friends(一个标签下有多个同名标签 )
/**
* 用Xstream注解的方式实现:一个标签下有多个同名标签
*@ClassName:Friends
*@author: chenyoulong Email: chen.youlong@payeco.com
*@date :2012-9-28 下午4:32:24
*@Description:TODO 5个name 中国,美国,俄罗斯,英国,法国
*http://blog.csdn.net/menhuanxiyou/article/details/5426765
*/
public static class Friends{
@XStreamImplicit(itemFieldName="name") //itemFieldName定义重复字段的名称,
/*<friends> <friends>
<name>A1</name> <String>A1</String>
<name>A2</name> 如果没有,则会变成 =====> <String>A1</String>
<name>A3</name> <String>A1</String>
</friends> </friends>
*/
private List<String> name; public List<String> getName() {
return name;
} public void setName(List<String> name) {
this.name = name;
}
}
[代码]4.1实体类:Animal(同一标签下循环对象实体1) //测试同一标签下循环某一对象
public class Animal{
@XStreamAlias("name")
private String name;
@XStreamAlias("age")
private int age;
public Animal(String name,int age){
this.name=name;
this.age=age;
} //省略setter和getter
} [代码]4.2实体类:Pets(同一标签下循环对象实体2) /**
* 测试同一标签下循环某一对象
*@ClassName:Pets
*@author: chenyoulong Email: chen.youlong@payeco.com
*@date :2012-9-28 下午6:26:01
*@Description:TODO
*/
public class Pets{
@XStreamImplicit(itemFieldName="pet")
private List<Animal> animalList; public List<Animal> getAnimalList() {
return animalList;
} public void setAnimalList(List<Animal> animalList) {
this.animalList = animalList;
} }
[代码]5.main函数示例1:toxml import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonWriter.Format;
import com.thoughtworks.xstream.io.xml.DomDriver; /**
*@ClassName:PersonTest
*@author: chenyoulong
*@date :2012-9-28 下午3:25:09
*@Description:TODO
*/
public class PersonTest { /**
* @Title: main
* @Description: TODO
* @param args
* @return void
*/
public static void main(String[] args) {
// TODO Auto-generated method stub PersonBean per=new PersonBean();
per.setFirstName("chen");
per.setLastName("youlong"); PhoneNumber tel=new PhoneNumber();
tel.setCode(137280);
tel.setNumber("137280968"); PhoneNumber fax=new PhoneNumber();
fax.setCode(20);
fax.setNumber("020221327");
per.setTel(tel);
per.setFax(fax); //测试一个标签下有多个同名标签
List<String> friendList=new ArrayList<String>();
friendList.add("A1");
friendList.add("A2");
friendList.add("A3");
Friends friend1=new Friends();
friend1.setName(friendList);
per.setFriend(friend1); //测试一个标签下循环对象
Animal dog=new Animal("Dolly",2);
Animal cat=new Animal("Ketty",2);
List<Animal> petList=new ArrayList<Animal>();
petList.add(dog);
petList.add(cat);
Pets pet=new Pets();
pet.setAnimalList(petList);
per.setPet(pet); //java对象转换成xml
String xml=XmlUtil.toXml(per);
System.out.println("xml==="+xml); }
}
[代码]xml效果图 xml===<person>
<firstName>chen</firstName>
<lastName>youlong</lastName>
<telphone>
<code>137280</code>
<number>137280968</number>
</telphone>
<faxphone>
<code>20</code>
<number>020221327</number>
</faxphone>
<friends>
<name>A1</name>
<name>A2</name>
<name>A3</name>
</friends>
<pets>
<pet>
<name>doly</name>
<age>2</age>
</pet>
<pet>
<name>Ketty</name>
<age>2</age>
</pet>
</pets>
</person>
[代码]5.2 main函数示例2:toBean public static void main(String[] args) {
// TODO Auto-generated method stub //toXml
// String xmlStr=new PersonTest().toXml(); //toBean
// PersonBean per=new PersonTest().toBean();
String xmlStr="<person>"+
"<firstName>chen</firstName>"+
"<lastName>youlong</lastName>"+
"<telphone>"+
"<code>137280</code>"+
"<number>137280968</number>"+
"</telphone>"+
"<faxphone>"+
"<code>20</code>"+
"<number>020221327</number>"+
"</faxphone>"+
"<friends>"+
"<name>A1</name>"+
"<name>A2</name>"+
"<name>A3</name>"+
"</friends>"+
"<pets>"+
"<pet>"+
"<name>doly</name>"+
"<age>2</age>"+
"</pet>"+
"<pet>"+
"<name>Ketty</name>"+
"<age>2</age>"+
"</pet>"+
"</pets>"+
"</person>";
//用泛型的知识
PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
System.out.println("person=firstname=="+person.getFirstName());
System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
System.out.println("person==Pets==name2=="+person.getPet().getAnimalList().get(1).getName()); /*
//效果与以下方法类同,(以下代码较为直观)
XStream xstream=new XStream(new DomDriver()); //注意:不是new Xstream(); 否则报错: xstream.processAnnotations(PersonBean.class);
PersonBean person=(PersonBean)xstream.fromXML(xmlStr);
System.out.println("person=firstname=="+person.getFirstName());
System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
System.out.println("person==Pets==name=="+person.getPet().getAnimalList().get(1).getName());
*/ }
[代码]6.XmlUtil工具类(toxml()和toBean())
/**
* 输出xml和解析xml的工具类
*@ClassName:XmlUtil
*@author: chenyoulong Email: chen.youlong@payeco.com
*@date :2012-9-29 上午9:51:28
*@Description:TODO
*/
public class XmlUtil{
/**
* java 转换成xml
* @Title: toXml
* @Description: TODO
* @param obj 对象实例
* @return String xml字符串
*/
public static String toXml(Object obj){
XStream xstream=new XStream();
// XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释
// XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释 ////如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
return xstream.toXML(obj);
} /**
* 将传入xml文本转换成Java对象
* @Title: toBean
* @Description: TODO
* @param xmlStr
* @param cls xml对应的class类
* @return T xml对应的class类的实例对象
*
* 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
*/
public static <T> T toBean(String xmlStr,Class<T> cls){
//注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
XStream xstream=new XStream(new DomDriver());
xstream.processAnnotations(cls);
T obj=(T)xstream.fromXML(xmlStr);
return obj;
} /**
* 写到xml文件中去
* @Title: writeXMLFile
* @Description: TODO
* @param obj 对象
* @param absPath 绝对路径
* @param fileName 文件名
* @return boolean
*/ public static boolean toXMLFile(Object obj, String absPath, String fileName ){
String strXml = toXml(obj);
String filePath = absPath + fileName;
File file = new File(filePath);
if(!file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
log.error("创建{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e));
return false ;
}
}// end if
OutputStream ous = null ;
try {
ous = new FileOutputStream(file);
ous.write(strXml.getBytes());
ous.flush();
} catch (Exception e1) {
log.error("写{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e1));
return false;
}finally{
if(ous != null )
try {
ous.close();
} catch (IOException e) {
log.error("写{"+ filePath +"}文件关闭输出流异常!!!" + Strings.getStackTrace(e));
}
}
return true ;
} /**
* 从xml文件读取报文
* @Title: toBeanFromFile
* @Description: TODO
* @param absPath 绝对路径
* @param fileName 文件名
* @param cls
* @throws Exception
* @return T
*/
public static <T> T toBeanFromFile(String absPath, String fileName,Class<T> cls) throws Exception{
String filePath = absPath +fileName;
InputStream ins = null ;
try {
ins = new FileInputStream(new File(filePath ));
} catch (Exception e) {
throw new Exception("读{"+ filePath +"}文件失败!", e);
} String encode = useEncode(cls);
XStream xstream=new XStream(new DomDriver(encode));
xstream.processAnnotations(cls);
T obj =null;
try {
obj = (T)xstream.fromXML(ins);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new Exception("解析{"+ filePath +"}文件失败!",e);
}
if(ins != null)
ins.close();
return obj;
} }

java生成解析xml的另外两种方法Xstream的更多相关文章

  1. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  2. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  4. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  5. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  6. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  7. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  8. WCF生成客户端代理对象的两种方法的解释

    最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...

  9. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

随机推荐

  1. Cisco ASA intra-interface routing

    LAN1和LAN2的默认路由指向各自的ASA,各ASA中设置对方LAN的静态路由指向ROUTER,打开ASA的intra-interface traffic,关闭LAN1和LAN2地址互相访问的NAT ...

  2. PyPy 2.1 正式版发布

    PyPy 2.1 Beta1 才刚刚在2天前发布,今天 PyPy 宣布 2.1 正式版发布. 值得关注的改进内容有: JIT support for ARM, architecture version ...

  3. 零配置Socket TCP消息通讯服务容器EC

    EC全称是elastic communication,是基于c#实现的Socket网络通讯服务容器,支持windows .Net和mono.通过EC容器可以让开发人员在不了解Socket网络通讯知识和 ...

  4. [Xamarin] 調用JSON.net 來解析JSON (转帖)

    上一篇文章我們提到了透過WebClient從Facebook 拿到我的JSON資料 再來我們要怎麼解析JSON格示呢?在.net 中,我們很孰悉的JSON.net,沒錯,我們依然可以在Xamarin中 ...

  5. AngularJS Providers 详解

    供应者(Providers) Each web application you build is composed of objects that collaborate to get stuff d ...

  6. hibernate中 inverse的用法(转载)

    http://blog.csdn.net/xiaoxian8023/article/details/15380529 一.Inverse是hibernate双向关系中的基本概念.inverse的真正作 ...

  7. java 解析xml

    http://developer.51cto.com/art/200903/117512.htm

  8. Eclipse连接到My sql数据库之前操作

    Eclipse连接到My sql数据库之前操作 1:首先是安装My sql数据库(为了减少你的麻烦,按照下面的连接,下载即可)百度云链接:http://pan.baidu.com/s/1mitWmbm ...

  9. android WebView控件显示网页

    有时需要app里面显示网页,而不调用其他浏览器浏览网页,那么这时就需要WebView控件.这个控件也是很强大的,放大,缩小,前进,后退网页都可以. 1.部分方法 //支持javascriptweb.g ...

  10. 题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? //一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米 doub ...