`

java 利用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)同一标签下循环多个对象;
标签: XStream

代码片段(12) [全屏查看所有代码]

1. [代码]1.实体类:PersonBean    

01 import java.util.List;
02  
03 import com.thoughtworks.xstream.annotations.XStreamAlias;
04 import com.thoughtworks.xstream.annotations.XStreamImplicit;
05  
06 /**
07  *@ClassName:PersonBean
08  *@author: chenyoulong  Email: chen.youlong@payeco.com
09  *@date :2012-9-28 下午3:10:47
10  *@Description:TODO
11  */
12 @XStreamAlias("person")
13 public class PersonBean {
14     @XStreamAlias("firstName")
15     private String firstName;
16     @XStreamAlias("lastName")
17     private String lastName;
18      
19     @XStreamAlias("telphone")
20     private PhoneNumber tel;
21     @XStreamAlias("faxphone")
22     private PhoneNumber fax;
23      
24     //测试一个标签下有多个同名标签
25     @XStreamAlias("friends")
26     private Friends friend;
27      
28     //测试一个标签下循环对象
29     @XStreamAlias("pets")
30     private Pets pet;
31      
32      
33     //省略setter和getter
34 }

2. [代码]2.实体类:PhoneNumber    

01 @XStreamAlias("phoneNumber")
02     public  class PhoneNumber{
03         @XStreamAlias("code")
04         private int code;
05         @XStreamAlias("number")
06         private String number;
07          
08             //省略setter和getter
09          
10     }

3. [代码]3.实体类:Friends(一个标签下有多个同名标签 )    

01 /**
02      * 用Xstream注解的方式实现:一个标签下有多个同名标签
03      *@ClassName:Friends
04      *@author: chenyoulong  Email: chen.youlong@payeco.com
05      *@date :2012-9-28 下午4:32:24
06      *@Description:TODO 5个name 中国,美国,俄罗斯,英国,法国
07      *http://blog.csdn.net/menhuanxiyou/article/details/5426765
08      */
09     public static class Friends{
10         @XStreamImplicit(itemFieldName="name")   //itemFieldName定义重复字段的名称,
11         /*<friends>                               <friends>
12             <name>A1</name>                         <String>A1</String>
13             <name>A2</name>    如果没有,则会变成    =====>       <String>A1</String>
14             <name>A3</name>                         <String>A1</String>
15         </friends>                                </friends>
16       */
17         private List<String> name;
18  
19         public List<String> getName() {
20             return name;
21         }
22  
23         public void setName(List<String> name) {
24             this.name = name;
25         }
26     }

4. [代码]4.1实体类:Animal(同一标签下循环对象实体1)    

01 //测试同一标签下循环某一对象
02     public  class Animal{
03         @XStreamAlias("name")
04         private String name;
05         @XStreamAlias("age")
06         private int age;
07         public Animal(String name,int age){
08             this.name=name;
09             this.age=age;
10         }
11          
12               //省略setter和getter
13     }
14     

5. [代码]4.2实体类:Pets(同一标签下循环对象实体2)    

01 /**
02      * 测试同一标签下循环某一对象
03      *@ClassName:Pets
04      *@author: chenyoulong  Email: chen.youlong@payeco.com
05      *@date :2012-9-28 下午6:26:01
06      *@Description:TODO
07      */
08     public class Pets{
09         @XStreamImplicit(itemFieldName="pet")
10         private List<Animal> animalList;
11          
12         public List<Animal> getAnimalList() {
13             return animalList;
14         }
15  
16         public void setAnimalList(List<Animal> animalList) {
17             this.animalList = animalList;
18         }
19          
20     }

6. [代码]5.main函数示例1:toxml    

01 import com.thoughtworks.xstream.XStream;
02 import com.thoughtworks.xstream.io.json.JsonWriter.Format;
03 import com.thoughtworks.xstream.io.xml.DomDriver;
04  
05 /**
06  *@ClassName:PersonTest
07  *@author: chenyoulong 
08  *@date :2012-9-28 下午3:25:09
09  *@Description:TODO
10  */
11 public class PersonTest {
12  
13     /**
14      * @Title: main
15      * @Description: TODO
16      * @param args
17      * @return void 
18      */
19     public static void main(String[] args) {
20         // TODO Auto-generated method stub
21          
22         PersonBean per=new PersonBean();
23         per.setFirstName("chen");
24         per.setLastName("youlong");
25          
26         PhoneNumber tel=new PhoneNumber();
27         tel.setCode(137280);
28         tel.setNumber("137280968");
29          
30         PhoneNumber fax=new PhoneNumber();
31         fax.setCode(20);
32         fax.setNumber("020221327");
33         per.setTel(tel);
34         per.setFax(fax);
35          
36          
37         //测试一个标签下有多个同名标签
38         List<String> friendList=new ArrayList<String>();
39         friendList.add("A1");
40         friendList.add("A2");
41         friendList.add("A3");
42         Friends friend1=new Friends();
43         friend1.setName(friendList);
44         per.setFriend(friend1);
45          
46         //测试一个标签下循环对象
47         Animal dog=new Animal("Dolly",2);
48         Animal cat=new Animal("Ketty",2);
49         List<Animal> petList=new ArrayList<Animal>();
50         petList.add(dog);
51         petList.add(cat);
52         Pets pet=new Pets();
53         pet.setAnimalList(petList);
54         per.setPet(pet);
55          
56                     //java对象转换成xml
57         String xml=XmlUtil.toXml(per);
58         System.out.println("xml==="+xml);
59          
60     }
61 }

7. [代码]xml效果图    

01 xml===<person>
02   <firstName>chen</firstName>
03   <lastName>youlong</lastName>
04   <telphone>
05     <code>137280</code>
06     <number>137280968</number>
07   </telphone>
08   <faxphone>
09     <code>20</code>
10     <number>020221327</number>
11   </faxphone>
12   <friends>
13     <name>A1</name>
14     <name>A2</name>
15     <name>A3</name>
16   </friends>
17   <pets>
18     <pet>
19       <name>doly</name>
20       <age>2</age>
21     </pet>
22     <pet>
23       <name>Ketty</name>
24       <age>2</age>
25     </pet>
26   </pets>
27 </person>

8. [代码]5.2 main函数示例2:toBean    

01 public static void main(String[] args) {
02         // TODO Auto-generated method stub
03          
04         //toXml
05 //      String xmlStr=new PersonTest().toXml();
06          
07         //toBean
08 //      PersonBean per=new PersonTest().toBean();
09         String xmlStr="<person>"+
10                   "<firstName>chen</firstName>"+
11                   "<lastName>youlong</lastName>"+
12                   "<telphone>"+
13                     "<code>137280</code>"+
14                     "<number>137280968</number>"+
15                   "</telphone>"+
16                   "<faxphone>"+
17                     "<code>20</code>"+
18                     "<number>020221327</number>"+
19                   "</faxphone>"+
20                   "<friends>"+
21                     "<name>A1</name>"+
22                     "<name>A2</name>"+
23                     "<name>A3</name>"+
24                   "</friends>"+
25                   "<pets>"+
26                     "<pet>"+
27                       "<name>doly</name>"+
28                       "<age>2</age>"+
29                     "</pet>"+
30                     "<pet>"+
31                       "<name>Ketty</name>"+
32                       "<age>2</age>"+
33                     "</pet>"+
34                   "</pets>"+
35                 "</person>";
36 //用泛型的知识
37         PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
38         System.out.println("person=firstname=="+person.getFirstName());
39         System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
40         System.out.println("person==Pets==name2=="+person.getPet().getAnimalList().get(1).getName());
41  
42 /*
43 //效果与以下方法类同,(以下代码较为直观)
44 XStream xstream=new XStream(new DomDriver()); //注意:不是new Xstream(); 否则报错:
45  
46         xstream.processAnnotations(PersonBean.class);
47         PersonBean person=(PersonBean)xstream.fromXML(xmlStr);
48         System.out.println("person=firstname=="+person.getFirstName());
49         System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
50         System.out.println("person==Pets==name=="+person.getPet().getAnimalList().get(1).getName());
51 */
52  
53          
54     }

9. [代码]6.XmlUtil工具类(toxml()和toBean())    

001 /**
002      * 输出xml和解析xml的工具类
003      *@ClassName:XmlUtil
004      *@author: chenyoulong  Email: chen.youlong@payeco.com
005      *@date :2012-9-29 上午9:51:28
006      *@Description:TODO
007      */
008     public class XmlUtil{
009         /**
010          * java 转换成xml
011          * @Title: toXml
012          * @Description: TODO
013          * @param obj 对象实例
014          * @return String xml字符串
015          */
016         public static String toXml(Object obj){
017             XStream xstream=new XStream();
018 //          XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释
019 //          XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释
020              
021             ////如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
022             xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
023             return xstream.toXML(obj);
024         }
025          
026         /**
027          *  将传入xml文本转换成Java对象
028          * @Title: toBean
029          * @Description: TODO
030          * @param xmlStr
031          * @param cls  xml对应的class类
032          * @return T   xml对应的class类的实例对象
033          *
034          * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
035          */
036         public static <T> T  toBean(String xmlStr,Class<T> cls){
037             //注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
038             XStream xstream=new XStream(new DomDriver());
039             xstream.processAnnotations(cls);
040             T obj=(T)xstream.fromXML(xmlStr);
041             return obj;        
042         }
043  
044        /**
045          * 写到xml文件中去
046          * @Title: writeXMLFile
047          * @Description: TODO
048          * @param obj 对象
049          * @param absPath 绝对路径
050          * @param fileName  文件名
051          * @return boolean
052          */
053        
054         public static boolean toXMLFile(Object obj, String absPath, String fileName ){
055             String strXml = toXml(obj);
056             String filePath = absPath + fileName;
057             File file = new File(filePath);
058             if(!file.exists()){
059                 try {
060                     file.createNewFile();
061                 } catch (IOException e) {
062                     log.error("创建{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e));
063                     return false ;
064                 }
065             }// end if
066             OutputStream ous = null ;
067             try {
068                 ous = new FileOutputStream(file);
069                 ous.write(strXml.getBytes());
070                 ous.flush();
071             } catch (Exception e1) {
072                 log.error("写{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e1));
073                 return false;
074             }finally{
075                 if(ous != null )
076                     try {
077                         ous.close();
078                     } catch (IOException e) {
079                         log.error("写{"+ filePath +"}文件关闭输出流异常!!!" + Strings.getStackTrace(e));
080                     }
081             }
082             return true ;
083         }
084          
085         /**
086          * 从xml文件读取报文
087          * @Title: toBeanFromFile
088          * @Description: TODO
089          * @param absPath 绝对路径
090          * @param fileName 文件名
091          * @param cls
092          * @throws Exception
093          * @return T
094          */
095         public static <T> T  toBeanFromFile(String absPath, String fileName,Class<T> cls) throws Exception{
096             String filePath = absPath +fileName;
097             InputStream ins = null ;
098             try {
099                 ins = new FileInputStream(new File(filePath ));
100             } catch (Exception e) {
101                 throw new Exception("读{"+ filePath +"}文件失败!", e);
102             }
103              
104             String encode = useEncode(cls);
105             XStream xstream=new XStream(new DomDriver(encode));
106             xstream.processAnnotations(cls);
107             T obj =null;
108             try {
109                 obj = (T)xstream.fromXML(ins);
110             } catch (Exception e) {
111                 // TODO Auto-generated catch block
112                 throw new Exception("解析{"+ filePath +"}文件失败!",e);
113             }
114             if(ins != null)
115                 ins.close();
116             return obj;        
117         }
118          
119     }

10. [文件] XStreamTest.rar ~ 11KB     下载(251)    

11. [文件] xpp3_min-1.1.4c.jar ~ 24KB     下载(144)    

12. [文件] xstream-1.4.1.jar ~ 484KB     下载(199)    

分享到:
评论

相关推荐

    Xstream生产xml和解析xml

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

    xstream轻松解析xml到java对象

    XStream的工作原理是基于反射和类型转换,它可以自动地映射Java类的字段到XML元素,反之亦然。这使得开发者无需编写大量繁琐的代码就能完成XML与Java对象之间的转换。下面我们将深入探讨Xstream的核心概念和使用方法...

    XStream解析xml demo

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

    java XStream xml解析 jar包.zip

    Java中的XStream库是一个强大的工具,它用于将Java对象序列化为XML,同时也能将XML数据反序列化回...通过这个包,开发者可以快速地在Java应用中集成XML序列化和反序列化功能,同时利用注解进行自定义,以满足特定需求。

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

    XStream的核心概念是它能够通过简单的注解或者类定义来映射XML结构,这使得XML和Java对象之间的转换变得非常直观。例如,你可以直接使用`XStream.fromXML(String xml)`方法将XML字符串转化为Java对象,反之亦然。 2...

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

    本篇文章将深入探讨如何在Android环境中利用XStream将对象转换成XML。 首先,我们需要理解XStream的基本工作原理。XStream的核心功能是它可以将Java对象直接映射到XML结构,反之亦然。这个过程叫做对象的序列化和反...

    xstream解析xml

    在描述中提到的`@XStreamAlias`是XStream提供的一个关键注解,用于给Java类或字段指定一个别名,这个别名将在生成的XML中作为元素名称出现。例如: ```java @XStreamAlias("person") public class Person { ...

    xstream+xmlpull xml to bean &&bean to xml

    XStream通过注解或者配置来处理复杂的对象结构,如嵌套对象、集合、泛型等,使得XML表示尽可能接近于原始的Java代码。 XMLPull API则提供了一种高效且低内存消耗的方式来解析XML文档。它不依赖DOM(Document Object...

    Xstream的xml转换

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

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

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

    Java转换xml.rar

    总的来说,"Java转换xml.rar"的资源可能包含使用XStream进行Java和XML转换的示例,这对于理解和实践Java中的XML处理非常有帮助。通过学习和掌握这一技术,开发者可以更高效地在Java应用中集成XML数据,实现数据的...

    Xstream操作Xml与Json.doc

    Xstream 是一个 Java 库,用于处理 XML 文件的序列化和反序列化,同时也支持将 JavaBean 转换为 JSON 格式。它的核心理念是通过简单的 API 设计,使得 XML 序列化过程变得简洁,无需额外的映射文件或辅助类。 ### 1...

    xStream完美转换XML.docx

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

    JavaXml及Bean互转

    本篇将详细介绍两种常用的Java XML与Bean互转方法:XStream库和JAXB(Java Architecture for XML Binding)框架。 一、XStream库 1. **XStream简介**: XStream是一个用于Java的轻量级库,它提供了一种简单的API来...

    xstream-1.3.1.zip

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

    xml操作之xstream

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

    java 对象的xml串行化 实现网络间的类信息的传输

    在给定的压缩包中,"xstream-1.3.1.jar"就是XStream库的一个版本,而"xpp3-1.1.3.3.jar"则是XStream依赖的一个解析器库,用于处理XML的解析和生成。 XStream的工作原理基于Java反射机制,它可以自动跟踪对象的字段...

    JAVA对象与XML互转

    2. **DOM解析**:解析XML文件得到DOM树,然后遍历树并创建相应的Java对象。这通常需要手动编写解析代码,比较繁琐。 3. **SAX解析**:Simple API for XML(SAX)是一种事件驱动的解析方式,适合处理大型XML文件。当...

    XStream jar包

    而"xpp3_min-1.1.3.4.I.jar"则是XStream的一个依赖库,它是XPack解析器的轻量级版本,主要用于XML的解析和生成。XPP3库提供了高效的DOM(文档对象模型)替代方案,通过事件驱动的解析方式,使得处理大型XML文档更加...

Global site tag (gtag.js) - Google Analytics