Xstream生成和解析xm和JAXB生成和解析xml的方法。

一,Xstream

Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar

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. [代码]1.实体类:PersonBean
  2.  
  3. import java.util.List;
  4.  
  5. import com.thoughtworks.xstream.annotations.XStreamAlias;
  6. import com.thoughtworks.xstream.annotations.XStreamImplicit;
  7.  
  8. /**
  9. *@ClassName:PersonBean
  10. *@author: chenyoulong Email: chen.youlong@payeco.com
  11. *@date :2012-9-28 下午3:10:47
  12. *@Description:TODO
  13. */
  14. @XStreamAlias("person")
  15. public class PersonBean {
  16. @XStreamAlias("firstName")
  17. private String firstName;
  18. @XStreamAlias("lastName")
  19. private String lastName;
  20.  
  21. @XStreamAlias("telphone")
  22. private PhoneNumber tel;
  23. @XStreamAlias("faxphone")
  24. private PhoneNumber fax;
  25.  
  26. //测试一个标签下有多个同名标签
  27. @XStreamAlias("friends")
  28. private Friends friend;
  29.  
  30. //测试一个标签下循环对象
  31. @XStreamAlias("pets")
  32. private Pets pet;
  33.  
  34. //省略setter和getter
  35. }
  36. [代码]2.实体类:PhoneNumber
  37.  
  38. @XStreamAlias("phoneNumber")
  39. public class PhoneNumber{
  40. @XStreamAlias("code")
  41. private int code;
  42. @XStreamAlias("number")
  43. private String number;
  44.  
  45. //省略setter和getter
  46.  
  47. }
  48. [代码]3.实体类:Friends(一个标签下有多个同名标签
  49. /**
  50. * 用Xstream注解的方式实现:一个标签下有多个同名标签
  51. *@ClassName:Friends
  52. *@author: chenyoulong Email: chen.youlong@payeco.com
  53. *@date :2012-9-28 下午4:32:24
  54. *@Description:TODO 5个name 中国,美国,俄罗斯,英国,法国
  55. *http://blog.csdn.net/menhuanxiyou/article/details/5426765
  56. */
  57. public static class Friends{
  58. @XStreamImplicit(itemFieldName="name") //itemFieldName定义重复字段的名称,
  59. /*<friends> <friends>
  60. <name>A1</name> <String>A1</String>
  61. <name>A2</name> 如果没有,则会变成 =====> <String>A1</String>
  62. <name>A3</name> <String>A1</String>
  63. </friends> </friends>
  64. */
  65. private List<String> name;
  66.  
  67. public List<String> getName() {
  68. return name;
  69. }
  70.  
  71. public void setName(List<String> name) {
  72. this.name = name;
  73. }
  74. }
  75. [代码]4.1实体类:Animal(同一标签下循环对象实体1
  76.  
  77. //测试同一标签下循环某一对象
  78. public class Animal{
  79. @XStreamAlias("name")
  80. private String name;
  81. @XStreamAlias("age")
  82. private int age;
  83. public Animal(String name,int age){
  84. this.name=name;
  85. this.age=age;
  86. }
  87.  
  88. //省略setter和getter
  89. }
  90.  
  91. [代码]4.2实体类:Pets(同一标签下循环对象实体2
  92.  
  93. /**
  94. * 测试同一标签下循环某一对象
  95. *@ClassName:Pets
  96. *@author: chenyoulong Email: chen.youlong@payeco.com
  97. *@date :2012-9-28 下午6:26:01
  98. *@Description:TODO
  99. */
  100. public class Pets{
  101. @XStreamImplicit(itemFieldName="pet")
  102. private List<Animal> animalList;
  103.  
  104. public List<Animal> getAnimalList() {
  105. return animalList;
  106. }
  107.  
  108. public void setAnimalList(List<Animal> animalList) {
  109. this.animalList = animalList;
  110. }
  111.  
  112. }
  113. [代码]5.main函数示例1toxml
  114.  
  115. import com.thoughtworks.xstream.XStream;
  116. import com.thoughtworks.xstream.io.json.JsonWriter.Format;
  117. import com.thoughtworks.xstream.io.xml.DomDriver;
  118.  
  119. /**
  120. *@ClassName:PersonTest
  121. *@author: chenyoulong
  122. *@date :2012-9-28 下午3:25:09
  123. *@Description:TODO
  124. */
  125. public class PersonTest {
  126.  
  127. /**
  128. * @Title: main
  129. * @Description: TODO
  130. * @param args
  131. * @return void
  132. */
  133. public static void main(String[] args) {
  134. // TODO Auto-generated method stub
  135.  
  136. PersonBean per=new PersonBean();
  137. per.setFirstName("chen");
  138. per.setLastName("youlong");
  139.  
  140. PhoneNumber tel=new PhoneNumber();
  141. tel.setCode(137280);
  142. tel.setNumber("137280968");
  143.  
  144. PhoneNumber fax=new PhoneNumber();
  145. fax.setCode(20);
  146. fax.setNumber("020221327");
  147. per.setTel(tel);
  148. per.setFax(fax);
  149.  
  150. //测试一个标签下有多个同名标签
  151. List<String> friendList=new ArrayList<String>();
  152. friendList.add("A1");
  153. friendList.add("A2");
  154. friendList.add("A3");
  155. Friends friend1=new Friends();
  156. friend1.setName(friendList);
  157. per.setFriend(friend1);
  158.  
  159. //测试一个标签下循环对象
  160. Animal dog=new Animal("Dolly",2);
  161. Animal cat=new Animal("Ketty",2);
  162. List<Animal> petList=new ArrayList<Animal>();
  163. petList.add(dog);
  164. petList.add(cat);
  165. Pets pet=new Pets();
  166. pet.setAnimalList(petList);
  167. per.setPet(pet);
  168.  
  169. //java对象转换成xml
  170. String xml=XmlUtil.toXml(per);
  171. System.out.println("xml==="+xml);
  172.  
  173. }
  174. }
  175. [代码]xml效果图
  176.  
  177. xml===<person>
  178. <firstName>chen</firstName>
  179. <lastName>youlong</lastName>
  180. <telphone>
  181. <code>137280</code>
  182. <number>137280968</number>
  183. </telphone>
  184. <faxphone>
  185. <code>20</code>
  186. <number>020221327</number>
  187. </faxphone>
  188. <friends>
  189. <name>A1</name>
  190. <name>A2</name>
  191. <name>A3</name>
  192. </friends>
  193. <pets>
  194. <pet>
  195. <name>doly</name>
  196. <age>2</age>
  197. </pet>
  198. <pet>
  199. <name>Ketty</name>
  200. <age>2</age>
  201. </pet>
  202. </pets>
  203. </person>
  204. [代码]5.2 main函数示例2toBean
  205.  
  206. public static void main(String[] args) {
  207. // TODO Auto-generated method stub
  208.  
  209. //toXml
  210. // String xmlStr=new PersonTest().toXml();
  211.  
  212. //toBean
  213. // PersonBean per=new PersonTest().toBean();
  214. String xmlStr="<person>"+
  215. "<firstName>chen</firstName>"+
  216. "<lastName>youlong</lastName>"+
  217. "<telphone>"+
  218. "<code>137280</code>"+
  219. "<number>137280968</number>"+
  220. "</telphone>"+
  221. "<faxphone>"+
  222. "<code>20</code>"+
  223. "<number>020221327</number>"+
  224. "</faxphone>"+
  225. "<friends>"+
  226. "<name>A1</name>"+
  227. "<name>A2</name>"+
  228. "<name>A3</name>"+
  229. "</friends>"+
  230. "<pets>"+
  231. "<pet>"+
  232. "<name>doly</name>"+
  233. "<age>2</age>"+
  234. "</pet>"+
  235. "<pet>"+
  236. "<name>Ketty</name>"+
  237. "<age>2</age>"+
  238. "</pet>"+
  239. "</pets>"+
  240. "</person>";
  241. //用泛型的知识
  242. PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
  243. System.out.println("person=firstname=="+person.getFirstName());
  244. System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
  245. System.out.println("person==Pets==name2=="+person.getPet().getAnimalList().get(1).getName());
  246.  
  247. /*
  248. //效果与以下方法类同,(以下代码较为直观)
  249. XStream xstream=new XStream(new DomDriver()); //注意:不是new Xstream(); 否则报错:
  250.  
  251. xstream.processAnnotations(PersonBean.class);
  252. PersonBean person=(PersonBean)xstream.fromXML(xmlStr);
  253. System.out.println("person=firstname=="+person.getFirstName());
  254. System.out.println("person==Friends==name1=="+person.getFriend().getName().get(0));
  255. System.out.println("person==Pets==name=="+person.getPet().getAnimalList().get(1).getName());
  256. */
  257.  
  258. }
  259. [代码]6.XmlUtil工具类(toxml()和toBean())
  260. /**
  261. * 输出xml和解析xml的工具类
  262. *@ClassName:XmlUtil
  263. *@author: chenyoulong Email: chen.youlong@payeco.com
  264. *@date :2012-9-29 上午9:51:28
  265. *@Description:TODO
  266. */
  267. public class XmlUtil{
  268. /**
  269. * java 转换成xml
  270. * @Title: toXml
  271. * @Description: TODO
  272. * @param obj 对象实例
  273. * @return String xml字符串
  274. */
  275. public static String toXml(Object obj){
  276. XStream xstream=new XStream();
  277. // XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释
  278. // XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释
  279.  
  280. ////如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
  281. xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
  282. return xstream.toXML(obj);
  283. }
  284.  
  285. /**
  286. * 将传入xml文本转换成Java对象
  287. * @Title: toBean
  288. * @Description: TODO
  289. * @param xmlStr
  290. * @param cls xml对应的class类
  291. * @return T xml对应的class类的实例对象
  292. *
  293. * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
  294. */
  295. public static <T> T toBean(String xmlStr,Class<T> cls){
  296. //注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
  297. XStream xstream=new XStream(new DomDriver());
  298. xstream.processAnnotations(cls);
  299. T obj=(T)xstream.fromXML(xmlStr);
  300. return obj;
  301. }
  302.  
  303. /**
  304. * 写到xml文件中去
  305. * @Title: writeXMLFile
  306. * @Description: TODO
  307. * @param obj 对象
  308. * @param absPath 绝对路径
  309. * @param fileName 文件名
  310. * @return boolean
  311. */
  312.  
  313. public static boolean toXMLFile(Object obj, String absPath, String fileName ){
  314. String strXml = toXml(obj);
  315. String filePath = absPath + fileName;
  316. File file = new File(filePath);
  317. if(!file.exists()){
  318. try {
  319. file.createNewFile();
  320. } catch (IOException e) {
  321. log.error("创建{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e));
  322. return false ;
  323. }
  324. }// end if
  325. OutputStream ous = null ;
  326. try {
  327. ous = new FileOutputStream(file);
  328. ous.write(strXml.getBytes());
  329. ous.flush();
  330. } catch (Exception e1) {
  331. log.error("写{"+ filePath +"}文件失败!!!" + Strings.getStackTrace(e1));
  332. return false;
  333. }finally{
  334. if(ous != null )
  335. try {
  336. ous.close();
  337. } catch (IOException e) {
  338. log.error("写{"+ filePath +"}文件关闭输出流异常!!!" + Strings.getStackTrace(e));
  339. }
  340. }
  341. return true ;
  342. }
  343.  
  344. /**
  345. * 从xml文件读取报文
  346. * @Title: toBeanFromFile
  347. * @Description: TODO
  348. * @param absPath 绝对路径
  349. * @param fileName 文件名
  350. * @param cls
  351. * @throws Exception
  352. * @return T
  353. */
  354. public static <T> T toBeanFromFile(String absPath, String fileName,Class<T> cls) throws Exception{
  355. String filePath = absPath +fileName;
  356. InputStream ins = null ;
  357. try {
  358. ins = new FileInputStream(new File(filePath ));
  359. } catch (Exception e) {
  360. throw new Exception("读{"+ filePath +"}文件失败!", e);
  361. }
  362.  
  363. String encode = useEncode(cls);
  364. XStream xstream=new XStream(new DomDriver(encode));
  365. xstream.processAnnotations(cls);
  366. T obj =null;
  367. try {
  368. obj = (T)xstream.fromXML(ins);
  369. } catch (Exception e) {
  370. // TODO Auto-generated catch block
  371. throw new Exception("解析{"+ filePath +"}文件失败!",e);
  372. }
  373. if(ins != null)
  374. ins.close();
  375. return obj;
  376. }
  377.  
  378. }

java生成解析xml的另外两种方法Xstream的更多相关文章

  1. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  2. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  4. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  5. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  6. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  7. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  8. WCF生成客户端代理对象的两种方法的解释

    最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...

  9. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

随机推荐

  1. php函数间的参数传递(值传递/引用传递)

    php:函数间的参数传递 1.值传递 代码如下: <?php function exam($var1){ $var1++: echo "In Exam:" . $var1 . ...

  2. APUE1

    [APUE]进程控制(上)   一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...

  3. jdk下载与安装及配置环境变量

    1.下载jdk 地址为:http://www.oracle.com/technetwork/java/javase/downloads/index.html2.安装jdk3.搭建环境变量    永久配 ...

  4. 仿花田:内部相亲网站 意中人(Asp.net MVC,Bootstrap2)

    起因: 那是七月份了,看见单身的同事在上花田网,当时觉得风格比较清新,还没有世纪佳缘等那些网站那么商业化,加上又看到了bootrstrap,于是就想做个demo出来玩玩.中间自己又在做其他的事情,和w ...

  5. 杂记 C中的volatile

    volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果没有volatile,基本上会导致 ...

  6. 近期code review几处小问题集锦

    1 线程池使用不当 我们的调度系统需要将一堆会员分配给相应的人员来处理,流程如以下伪代码所示: public void dispatch() { while (true) { List<Memb ...

  7. Kafka重复消费和丢失数据研究

    Kafka重复消费原因 底层根本原因:已经消费了数据,但是offset没提交. 原因1:强行kill线程,导致消费后的数据,offset没有提交. 原因2:设置offset为自动提交,关闭kafka时 ...

  8. atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o

    atitit. 浏览器插件 控件   applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o 1. 服务器部署签名 1 2. 签名流程::生成密钥..导出cert正书,签名 1 3. ...

  9. Leetcode 189 Rotate Array stl

    题意:将数组旋转k次,如将数组[1,2,3,4,5]旋转1次得到[2,3,4,5,1],将数组[1,2,3,4,5]旋转2次得到[3,4,5,1,2]..... 本质是将数组分成两部分a1,a2,.. ...

  10. SpringCloud+Consul 服务注册与服务发现

    SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...