`

Xstream解析

    博客分类:
  • XML
 
阅读更多
java 利用Xstream生成和解析xml,知识结构:

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;            
        } 
        
    }
分享到:
评论

相关推荐

    XStream解析XML实例

    **XStream解析XML实例** 在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作...

    XStream解析xml demo

    本篇文章将深入探讨XStream解析XML的示例,帮助你理解和掌握这一强大的工具。 首先,我们需要理解XStream的基本用法。XStream的核心概念是通过为Java对象定义一个映射,使得对象的字段与XML元素一一对应。这可以...

    使用xstream解析xml,xml与pojo的双向转化,完整的java 工程

    以下是使用XStream解析XML和POJO双向转化的基本步骤: 1. 引入XStream库:在Java工程中,需要添加XStream的jar包,通常可以通过Maven或Gradle等构建工具管理依赖。在这个项目中,"lib"目录下应该包含XStream的jar...

    Xstream解析xml

    本篇文章将深入探讨如何利用Xstream解析XML文件,并将解析后的数据存储到MySQL数据库中。 首先,我们需要了解Xstream的基本用法。Xstream的核心在于创建一个`XStream`实例,然后通过这个实例来转换XML和Java对象。...

    xstream解析依赖包

    《XStream解析依赖包详解》 在Java开发中,数据序列化是一个不可或缺的环节,它使得对象的状态可以被保存和恢复。XStream是一款强大的Java库,用于将Java对象转换为XML,反之亦然,极大地简化了序列化和反序列化的...

    XStream解析字符串不同的标签

    转换器负责将对象转换成 XML 格式,以及将 XML 解析回对应的 Java 对象。XStream 提供了丰富的内置转换器来处理标准的 Java 类型,同时允许开发者自定义转换器以处理自定义类。 在描述中提到的 "xstream-1.4.4.jar...

    XStream解析各种数据格式

    ### XStream解析各种数据格式 #### 一、XStream简介 XStream 是一个简单高效的 Java 库,用于将 Java 对象序列化为 XML 文档,同时也支持从 XML 文档反序列化为 Java 对象。它提供了简洁的 API 来简化序列化过程,...

    使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar

    在XStream解析XML文件时,通常需要两个关键的jar包: 1. **xpp3_min-1.1.3.4.O.jar**:这是Minimal XML Pull Parser(XPP3)的轻量级版本,它是一个高效的XML解析器,用于读取XML文档。XPP3被XStream用来解析XML流...

    xstream 解析XML例程(android)

    * xstream 解析xml测试,本程序使用两种方式进行解析 * 分别为:注解方式与编程设置别名方式 * 注解方式代码更为简单,但对model需要用注解方式编写 * 编程设置别名方式代码稍复杂,但更灵活。 * @author 蜜我 ...

    xstream解析的资料

    本篇文章将深入探讨XStream库的核心概念、工作原理以及如何与SAX解析器结合使用。 首先,我们需要理解XStream的基本原理。XStream通过反射机制来实现对象到XML的转换。它能够自动处理对象的字段,包括嵌套的对象和...

    xStream解析工具包

    Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列...

    XStream XML解析

    **XStream XML解析** XStream 是一个开源的 Java 库,它提供了一种简单而有效的方式来将 Java 对象序列化为 XML 和从 XML 反序列化回 Java 对象。这个库的强大之处在于其简洁的API和对复杂Java对象模型的处理能力。...

    XStream解析xml 转换成对象案例

    XStream会自动处理这个映射过程,无需编写复杂的DOM或SAX解析代码。 下面是一个简单的Java类示例,用于表示XML文档中的一个“Person”实体: ```java public class Person { private String name; private int ...

    android 使用XStream解析xml的实例

    android 使用XStream解析xml的实例 android平台上,解析xml文件是一种非常常见的操作。XStream是一个高性能的XML解析库,它可以将xml文件转换成Java对象,从而方便地进行数据处理。本文将介绍如何使用XStream解析...

    xstream轻松解析xml到java对象

    然而,处理XML数据时,解析和转换为可操作的对象是一个常见挑战。这时,XStream库就派上了用场。XStream是一个Java库,它能将Java对象序列化为XML,同时也能将XML反序列化为Java对象,极大地简化了XML处理过程。 ...

    XStream 解析 android

    本文将深入探讨XStream如何在Android环境中解析XML文件,以及其主要特性和优势。 XStream的核心功能是能够将Java对象转换为XML字符串,并反之将XML字符串转换回Java对象。这种转换过程被称为对象XML绑定。XStream的...

    xml解析及使用XStream实现javaBean与xml之间的转换

    在`xmlAnalysis`文件夹中,可能包含了一个简单的Java程序,演示了如何使用DOM、SAX、StAX和XStream解析XML文件,并展示了XStream如何在JavaBean与XML之间进行转换。你可以运行这些代码,观察输出结果,以加深理解。...

    xstream解析xml

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,广泛应用在各种系统间的数据...实际应用中,开发者可以根据这些知识对XML数据进行读取、解析和存储,提升开发效率和代码可读性。

    xstream方式解析xml文件

    xstream方式解析及生成xml文件

    使用XStream是实现XML与Java对象的转换(5)--Object Stream

    XStream是一个强大的库,它使得XML与Java对象之间的转换变得简单。在这个主题中,我们将深入探讨如何使用XStream进行XML与Java对象的互换,并了解其工作原理。 首先,XStream是一个开源库,由Johannes Leutenegger...

Global site tag (gtag.js) - Google Analytics