`

使用Xstream注解生成和解析xml

    博客分类:
  • 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)同一标签下循环多个对象;

  

maven 依赖:

<dependency>
		    <groupId>com.thoughtworks.xstream</groupId>
		    <artifactId>xstream</artifactId>
		    <version>1.4.8</version>
		</dependency>

 

1. [代码]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. [代码]2.实体类:PhoneNumber 

@XStreamAlias("phoneNumber")
    public  class PhoneNumber{
        @XStreamAlias("code")
        private int code;
        @XStreamAlias("number")
        private String number;
         
            //省略setter和getter
         
    }

 

3. [代码]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. [代码]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
    }

 

5. [代码]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;
        }
         
    }

 

6. [代码]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);
         
    }
}

 

7. [代码]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>

 

8. [代码]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());
*/
 
         
    }

 

9. [代码]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;         
        } 
         
    }

 

来源:https://www.oschina.net/code/snippet_116183_14202

 

 

 

 

 

分享到:
评论

相关推荐

    java 利用Xstream注解生成和解析xml

    Xstream通过使用注解提供了高度的灵活性,使得XML的生成和解析更加简单和直观。在这篇文章中,我们将深入探讨如何利用Xstream的注解来处理XML。 首先,要使用Xstream,我们需要在项目中引入其依赖。如果你使用的是...

    Xstream生产xml和解析xml

    ### Xstream:Java与XML之间的...这段代码定义了两个类:`Address`和`Person`,并使用XStream注解进行了映射配置。通过这些配置,XStream能够智能地处理类及其属性的XML映射,极大地简化了序列化和反序列化的开发工作。

    XStream解析xml demo

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

    xstream轻松解析xml到java对象

    自XStream 1.4版本开始,可以使用注解来更精确地控制XML元素和属性的映射,例如: ```java @XStreamAlias("customName") public class YourJavaClass { @XStreamAsAttribute private int id; // ... } ``` ...

    xstream解析xml

    1. **直观的映射:** XStream通过使用注解或配置来定义Java类与XML元素之间的映射关系。这种映射方式使得代码更简洁且易于理解。 2. **自动类型探测:** 在没有明确映射的情况下,XStream能够自动推断对象的类型,...

    java解析XML所需要的完整包(包括XStream.jar,dom4j.jar和xpull/xpp.jar)

    它的主要优点是易于使用和理解,且生成的XML结构清晰,适合于存储和传输数据。XStream的核心概念是它能够通过简单的注解或者类定义来映射XML结构,这使得XML和Java对象之间的转换变得非常直观。例如,你可以直接使用...

    java XStream xml解析 jar包.zip

    - XStream支持使用Java的注解来进一步定制序列化和反序列化的过程。例如,你可以使用`@XStreamAlias`定义XML元素的别名,`@XStreamAsAttribute`使字段作为XML属性而不是元素出现。 4. **包含的JAR文件**: - `...

    android XMl 解析神奇xstream 二: 把对象转换成xml

    XStream通过使用 Annotation 支持来自定义XML输出的格式,这使得我们可以灵活地控制XML的生成方式。 1. **集成XStream库**:在Android项目中,首先需要引入XStream库。由于XStream并不是Android原生支持的库,因此...

    xstream+xmlpull xml to bean &&bean to xml

    XMLPull是轻量级的API,用于解析XML文档,它允许开发者以事件驱动的方式处理XML流,而无需提前加载整个文档到内存中。 XStream的核心功能在于它的“marshalling”和“unmarshalling”能力。Marshalling是将Java对象...

    XStream:Object与Xml字符串 互相转换

    XStream是一个强大的Java库,它允许开发者方便地将Java对象序列化为XML,同时也能将XML数据反...通过理解和掌握XStream的用法,开发者可以更高效地处理数据序列化需求,无论是在存储、传输还是解析XML文档的场景下。

    Xstream的xml转换

    Xstream支持使用Java注解来更精细地控制XML的生成和解析。例如,你可以使用`@XStreamAlias`来定义类或字段的别名,`@XStreamAsAttribute`使字段作为XML的属性出现,`@XStreamImplicit`用于处理集合时避免生成额外的...

    xml操作之xstream

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用在数据交换、配置文件以及文档存储等领域。...在理解和使用XStream时,重点应放在其核心功能和如何利用注解来优化XML结构上。

    Xstream操作Xml与Json.doc

    对于集合字段,可以使用 `@XStreamImplicit` 注解,避免生成集合根节点,简化 XML 结构: ```java public class MyClass { @XStreamImplicit List&lt;MyItem&gt; items; // ... } ``` ### 5. 更深入的应用 除了上述...

    xStream完美转换XML.docx

    2. **注解支持**:通过使用Java的`@XStreamAlias`,`@XStreamAsAttribute`等注解,开发者可以自定义XML节点和属性的名称,增强XML的可读性。 3. **JSON支持**:除了XML,xStream还支持JSON转换。通过使用`...

    xstream-1.3.1.zip

    这种方式既灵活又高效,特别适合于动态生成或解析XML的场景。 在XStream中,"javabean与xml之间的转化"是通过反射和类型转换机制实现的。每个Java类被映射为一个XML元素,类的属性对应于XML的子元素。默认情况下,...

    XStream-1.4.7的包和源代码

    2. `xpp3_min-1.1.4c.jar`:这是一个依赖库,用于处理 XML Pull API,XStream 使用它来解析和生成 XML。 3. `xmlpull-1.1.3.1.jar`:XML Pull API 的实现,它是 Xpp3 的依赖。 4. `stax-api-1.0.1.jar`:STAX...

    XStream及依赖包

    `xpp3_min-1.1.3.4.O.jar`是XPP3(pull解析器)的轻量级版本,XStream依赖这个库来解析和生成XML。XPP3是一种高效的XML解析器,它采用pull解析模式,而不是基于事件的SAX或DOM解析,因此内存占用较低,性能更好。XPP...

    xstream_1.4.3及其依赖包_xstream_1.4.3及其依赖包

    描述中提到,“解析xml文件需要用到jar包,内容包含xstream_1.4.3及_xstream_1.4.3 -dom4j及其依赖包”,这表明除了XStream本身之外,还包含了DOM4J库,因为DOM4J是一个强大的Java XML API,常被XStream用作默认的...

    XStream示例(含jar包)

    在转换过程中,XStream 使用了反射和类型安全的转换规则来确保对象和 XML 之间的准确映射。 **XStream 的使用步骤** 1. **引入依赖**:在 Java 项目中,你需要添加 XStream 相关的 jar 包,如 `xstream-1.4.7.jar`...

    详解XML,Object,Json转换与Xstream的使用

    默认情况下,XStream使用Xpp3库解析XML。若想使用DOM解析器,可以这样初始化: ```java XStream xstream = new XStream(new DomDriver()); ``` 初始化后的`Xstream`实例是线程安全的,可以供多线程共享。 **常用...

Global site tag (gtag.js) - Google Analytics