java生成解析xml的另外两种方法Xstream
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的更多相关文章
- java生成解析xml的另外两种方法JAXB
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- Java构造和解析Json数据的两种方法详解二——org.json
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...
- Java构造和解析Json数据的两种方法详解一——json-lib
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- java 获取键盘输入常用的两种方法
java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- WCF生成客户端代理对象的两种方法的解释
最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...
- Java构造和解析Json数据的两种方法详解一
一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...
随机推荐
- php函数间的参数传递(值传递/引用传递)
php:函数间的参数传递 1.值传递 代码如下: <?php function exam($var1){ $var1++: echo "In Exam:" . $var1 . ...
- APUE1
[APUE]进程控制(上) 一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...
- jdk下载与安装及配置环境变量
1.下载jdk 地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html2.安装jdk3.搭建环境变量 永久配 ...
- 仿花田:内部相亲网站 意中人(Asp.net MVC,Bootstrap2)
起因: 那是七月份了,看见单身的同事在上花田网,当时觉得风格比较清新,还没有世纪佳缘等那些网站那么商业化,加上又看到了bootrstrap,于是就想做个demo出来玩玩.中间自己又在做其他的事情,和w ...
- 杂记 C中的volatile
volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致 ...
- 近期code review几处小问题集锦
1 线程池使用不当 我们的调度系统需要将一堆会员分配给相应的人员来处理,流程如以下伪代码所示: public void dispatch() { while (true) { List<Memb ...
- Kafka重复消费和丢失数据研究
Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交. 原因1:强行kill线程,导致消费后的数据,offset没有提交. 原因2:设置offset为自动提交,关闭kafka时 ...
- atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o
atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o 1. 服务器部署签名 1 2. 签名流程::生成密钥..导出cert正书,签名 1 3. ...
- Leetcode 189 Rotate Array stl
题意:将数组旋转k次,如将数组[1,2,3,4,5]旋转1次得到[2,3,4,5,1],将数组[1,2,3,4,5]旋转2次得到[3,4,5,1,2]..... 本质是将数组分成两部分a1,a2,.. ...
- SpringCloud+Consul 服务注册与服务发现
SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...