专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > JavaScript

XStream实现xml和java对象之间的相互转换(包括对属性,别名,下划线_的处理),同理JSON也可以

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以

原文链接:   http://blog.csdn.net/simonchi/article/details/38926817

 

首先去官网下载响应JAR包

http://xstream.codehaus.org/index.html

最少需要两个jar包,一个xstream.jar,一个是xmlpull.jar

首先来看下java对象到xml的转换

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package xml;  
  2.   
  3. class PhoneNumber {  
  4.       
  5.     private int code;  
  6.       
  7.     private int number;  
  8.   
  9.     public int getCode() {  
  10.         return code;  
  11.     }  
  12.   
  13.     public void setCode(int code) {  
  14.         this.code = code;  
  15.     }  
  16.   
  17.     public int getNumber() {  
  18.         return number;  
  19.     }  
  20.   
  21.     public void setNumber(int number) {  
  22.         this.number = number;  
  23.     }  
  24.       
  25. }  
  26.   
  27. public class Person {  
  28.   
  29.     private String username;  
  30.       
  31.     private int age;  
  32.       
  33.     private PhoneNumber pn;  
  34.   
  35.     public String getUsername() {  
  36.         return username;  
  37.     }  
  38.   
  39.     public void setUsername(String username) {  
  40.         this.username = username;  
  41.     }  
  42.   
  43.     public int getAge() {  
  44.         return age;  
  45.     }  
  46.   
  47.     public void setAge(int age) {  
  48.         this.age = age;  
  49.     }  
  50.   
  51.     public PhoneNumber getPn() {  
  52.         return pn;  
  53.     }  
  54.   
  55.     public void setPn(PhoneNumber pn) {  
  56.         this.pn = pn;  
  57.     }  
  58.       
  59. }  


以上是一个普通的java对象

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package xml;  
  2.   
  3. import com.thoughtworks.xstream.XStream;  
  4. import com.thoughtworks.xstream.io.xml.StaxDriver;  
  5.   
  6. public class XmlUtils {  
  7.   
  8.     private static XStream xs = new XStream(new StaxDriver());  
  9.       
  10.     public static String objToXml(Object obj) {  
  11.         //xs.aliasPackage(name, pkgName);  
  12.         return xs.toXML(obj);  
  13.     }  
  14.       
  15.     public static void main(String[] args) {  
  16.         Person p = new Person();  
  17.         p.setAge(26);  
  18.         p.setUsername("chiwei");  
  19.         PhoneNumber pn = new PhoneNumber();  
  20.         pn.setCode(188);  
  21.         pn.setNumber(67101080);  
  22.         p.setPn(pn);  
  23.         xs.alias("person", Person.class);  
  24.         String xml = objToXml(p);  
  25.         Person per = (Person)xs.fromXML(xml);  
  26.         System.out.println(xml);  
  27.         System.out.println(per.getUsername());  
  28.     }  
  29. }  


以上代码,先是生成一个对象,给各个属性赋值,然后调用toXML将对象转换为xml格式的普通文本,注意在转换前调用了alias目的是为了将xml.Person重命名为person

<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>

这里xstream实例化时候传入了StaxDriver表示A driver using the StAX API to create XML reader and writer.

如果你使用xpp3driver,你需要引入该jar包

后面则根据上面转换后的xml继续转换成相应的对象Person

<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>
chiwei

 

很简单

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. xs.alias("person", Person.class);  
  2.         xs.useAttributeFor(Person.class,"username");  
  3.         xs.aliasAttribute(Person.class"username","name");  

这种情况是将属性写到XML元素的里面作为属性,而不是单独作为一个子元素,如下所示:
<person name="chiwei">
  <age>26</age>
</person>

------------------------------------------------------------------------------- 华丽的分割线 -------------------------------------------------------------------------------------------

以上的例子的确很简单,下面看看一些别的处理

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. xs.aliasField("res_type", SLIR.class"resType");  

该 方法是用于将SLIR类中的resType属性在XML元素中显示为res_type,这里看到有一个下划线_,其实在xstream实例化的时候,如果 没有用到XmlFriendlyNameCoder的话,可能下划线_就会变成__,因为在这里_其实是转移符,所以我们实例化xstream的时候应该 如下:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private static XStream xs = new XStream(new DomDriver(null,new XmlFriendlyNameCoder("_-""_")));  

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. xs.useAttributeFor(RequestMode.class"type");  

该方法的目的是将RequestMode类中的type属性作为该XML元素的内部属性

<requestmode type="PASSIVE"/>

 

最后再来看下,XML元素同时又属性和值得时候怎么处理

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <msid enc="ASC" type="MSISDN">13505602768</msid>  

如上所示,msid元素拥有两个属性,同时又拥有自己的值,这时候,在做转化的时候,必须自定义转换器converter才行

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import com.thoughtworks.xstream.converters.Converter;  
  2. import com.thoughtworks.xstream.converters.MarshallingContext;  
  3. import com.thoughtworks.xstream.converters.UnmarshallingContext;  
  4. import com.thoughtworks.xstream.io.HierarchicalStreamReader;  
  5. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;  
  6.   
  7. public class ReqMsidConverter implements Converter {  
  8.   
  9.     @SuppressWarnings("rawtypes")  
  10.     @Override  
  11.     public boolean canConvert(Class type) {  
  12.         // TODO Auto-generated method stub  
  13.         return type.equals(Msid.class);  
  14.     }  
  15.   
  16.     @Override  
  17.     public void marshal(Object source, HierarchicalStreamWriter writer,  
  18.             MarshallingContext context) {  
  19.         // TODO Auto-generated method stub  
  20.         Msid msid = (Msid)source;  
  21.         writer.addAttribute("enc", msid.getEnc());  
  22.         writer.addAttribute("type", msid.getType());  
  23.         writer.setValue(msid.getMsid());  
  24.     }  
  25.   
  26.     @Override  
  27.     public Object unmarshal(HierarchicalStreamReader reader,  
  28.             UnmarshallingContext context) {  
  29.         // TODO Auto-generated method stub  
  30.         Msid msid = new Msid();  
  31.         msid.setEnc(reader.getAttribute("enc"));  
  32.         msid.setType(reader.getAttribute("type"));  
  33.         msid.setMsid(reader.getValue());  
  34.         return msid;  
  35.     }  
  36.   
  37. }  

定义完该转换器后,将其注册到xstream上即可

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. xs.registerConverter(new ReqMsidConverter()); 
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: