标签:
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子。
原来自己操作xml一直用这个包:xstream-1.4.2.jar。然后用注解的方式,很方便,自己只要定义好bean的层次结构就可以了,第三方包会自动生成和解析xml。
但是今天发现,这个包有两个问题: 一个是比较复杂(我是菜鸟,求别喷,我真的觉得他挺复杂的。。)。比如说你要想处理既有属性又有值的xml就比较麻烦。(@XStreamConverter注解这种方法报这个错:com.thoughtworks.xstream.InitializationException)。搜了一下说是包冲突了。。
xstream最大的问题个人觉得是需要的类太多了。。。 可能是我们公司的xml格式不太规范。。。 不过这是历史遗留问题,我个人是没办法的。 比如这么一个xml:
<a> <b> <c> <d> xxx </d></c></b></a>
如果用xstream的话,就要声明4个类(对他不熟,如果谁知道可以一个类搞定请指点),而用dom4j的话就一句:e.addElement("a").addElement("b").addElement("c").addElement("d").setText("xxx");
本文就用dom4j实现一个简单的bean到xml,和xml到bean的互换。
首先,是bean:
class Bean{ private String name; private String nameParam; private String age; private String ageParam; public Bean(String xml){ //这里是构造方法,通过xml转换成bean } public String toXML(){ //这里是bean转换成xml的方法 } }
xml为:
<Student> <name nameP="这是name的属性">张三</name> <age ageP="这是年龄的属性">12</age> </Student>
xml转换成bean的方法为:
{ //获取Document 对象 Document document = DocumentHelper.parseText(xml); //获取根节点(就是student节点) Element el = document.getRootElement(); //获取根节点下的节点: Element name = el.element("name"); this.name = name.getText(); this.nameParam = name.attributeValue("nameP"); Element age= el.element("age"); this.age = age.getText(); this.ageParam = age.attributeValue("ageP"); }
toXML方法:
// 获取Document对象 Document doc = DocumentHelper.createDocument(); // 创建根节点: Element rootEle = doc.addElement("Student"); // 创建子节点: Element name = rootEle.addElement("name"); name.addAttribute("nameP", this.nameParam); name.setText(this.name); Element age = rootEle.addElement("age"); age.addAttribute("ageP", this.ageParam); age.setText(this.age); return doc.asXML();
测试代码:
public void Test(){ String xml = "<Student><name nameP=\"这是name的属性\">张三</name><age ageP=\"这是年龄的属性\">12</age></Student>"; Bean b = new Bean(xml); System.out.println("name:\t"+b.getName()+"\tnamePra:\t"+b.getNameParam()); System.out.println("age:\t"+b.getAge()+"\tagePra:\t"+b.getAgeParam()); System.out.println("再生成xml:"); System.out.println(b.toXML()); }
结果:
name: 张三 namePra: 这是name的属性 age: 12 agePra: 这是年龄的属性 再生成xml: <?xml version="1.0" encoding="UTF-8"?> <Student><name nameP="这是name的属性">张三</name><age ageP="这是年龄的属性">12</age></Student>
个人小结:
首先,dom4j和XStream都是非常优秀的处理xml的第三方包。他们各有各的长处。
XStream的优点在于可以用配置代替代码。xml不用自己拼,这样犯错的几率就小一些,(而且不用写那么长的拼xml的语句)但是灵活性可能就会牺牲掉。
dom4j的优点在于简单,特别简单而且灵活。xml都是自己拼,而且解析也是自己挨个节点解析。用起来特别简单,但是真的是自己拼所有的xml。。 拼起来比较麻烦而且容易出错。
标签:
原文地址:http://www.cnblogs.com/xuejupo/p/5218189.html