xstream框架

xStream框架

xStream框架简介

xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换,xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。以及对JSON也支持,只需要提供相关的JSONDriver就可以完成转换。其他框架:

json-lib,jackson,XStream,Castor,jaxb2,jibx

下载jar包、及官方资源

xStreamjar下载地址:

https://nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/xstream-distribution/1.3.1/xstream-distribution-1.3.1-bin.zip

官方参考示例:http://xstream.codehaus.org/tutorial.html

实例

PersonBean

import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
/**
 *@ClassName:PersonBean
 *@author: chengyou 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
}
1.3.2. PhoneNumber

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

Friends(用Xstream注解的方式实现:一个标签下有多个同名标签 )

/**
  * 用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")   
        private List<String> name;
        public List<String> getName() {
            return name;
        }
        public void setName(List<String> name) {
            this.name = name;
        }
}

itemFieldName定义重复字段的名称,

<friends>       

<name>A1</name>  

<name>A1</name>                       

</friends>

如果没有,则会变成 

<friends>   

<String>A1</String>

<String>A1</String>

</friends> 

 Animal

//测试同一标签下循环某一对象
 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
 }

Pets

/**
* 测试同一标签下循环某一对象
*/
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;
     }  
 }

1.4. 测试

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) {
        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的工具类
 */
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.processAnnotations(obj.getClass()); 
          return xstream.toXML(obj);
        }
     /**
      *  将传入xml文本转换成Java对象
      * @Title: toBean 
      * @Description: TODO 
      * @param xmlStr
      * @param cls  xml对应的class类
      * @return T   xml对应的class类的实例对象
      */
      public static <T> T  toBean(String xmlStr,Class<T> cls){
          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;         
        } 
    }

Stream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释

XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释

测试结果

<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>


常用注解

@XStreamAlias("message") 别名注解  
作用目标: 类,字段  
@XStreamImplicit 隐式集合  
@XStreamImplicit(itemFieldName="part")  
作用目标: 集合字段  
@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器  
作用目标: 对象  
@XStreamAsAttribute 转换成属性  
作用目标: 字段  
@XStreamOmitField 忽略字段  
作用目标: 字段  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值