- 浏览: 390624 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
Nabulio:
写的详细,特殊语法学习到了
jdk1.5-1.9新特性 -
wooddawn:
您好,最近在做个足球数据库系统,用到了betbrain的数据表 ...
javascript深入理解js闭包 -
lwpan:
很受启发 update也可以
mysql 的delete from 子查询限制 -
wuliaolll:
不错,总算找到原因了
mysql 的delete from 子查询限制
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 }
使用限制: 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 }
发表评论
-
将json格式的字符数组转为List对象
2015-08-10 15:18 905使用的是json-lib.jar包 将json格式的字符数组 ... -
用httpPost对JSON发送和接收的例子
2015-08-10 11:16 1100HTTPPost发送JSON: private static ... -
zookeeper适用场景:zookeeper解决了哪些问题
2015-07-31 18:01 763问题导读: 1.master挂机 ... -
java泛型
2015-07-29 10:48 770什么是泛型? 泛型(Ge ... -
Java线程Dump分析工具--jstack
2015-06-23 11:09 722jstack用于打印出给定的java进程ID或core fil ... -
什么是spark?
2015-04-10 09:37 495关于Spark: Spark是UC Berkeley AM ... -
dubbo 教程
2015-04-09 19:21 780先给出阿里巴巴dubbo的 ... -
jre/bin目录下面工具说明
2015-03-20 16:45 637jre/bin目录下面工具说明 ... -
JVM系列三:JVM参数设置、分析
2015-01-30 11:18 700不管是YGC还 ... -
jstat使用
2015-01-27 11:11 679jstat 1. jstat -gc pid ... -
查看java堆栈情况(cpu占用过高)
2015-01-27 11:10 7461. 确定占用cpu高的线程id: 方法一: 直接使用 ps ... -
慎用ArrayList的contains方法,使用HashSet的contains方法代替
2015-01-20 14:14 1148在启动一个应用的时候,发现其中有一处数据加载要数分钟,刚开始 ... -
Java虚拟机工作原理详解
2015-01-16 10:00 719一、类加载器首先来 ... -
jdk1.5-1.9新特性
2014-11-11 10:22 83411.51.自动装箱与拆箱:2.枚举(常用来设计单例模式 ... -
java动态代理(JDK和cglib)
2014-09-24 15:51 478JAVA的动态代理 代理模式 代理模式是常用的java设计 ... -
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2014-09-24 15:45 699class文件简介及加载 Java编译器编译 ... -
怎么用github下载资源
2014-09-24 11:18 4581、下载github:到http://windows. ... -
maven项目时jar包没有到lib目录下
2014-09-01 20:05 2598在建项目时路径都设置好了,为什么在eclipse中运行mav ... -
使用并行计算大幅提升递归算法效率
2014-08-27 15:04 607前言: 无论什么样的 ... -
JAVA 实现FTP
2014-08-22 14:41 707一个JAVA 实现FTP功能的代码,包括了服务器的设置模块, ...
相关推荐
解析XML回Java对象同样简单,只需使用`fromXML()`方法: ```java String xmlInput = "<person id='1'><firstName>John</firstName><lastName>Doe</lastName></person>"; Person parsedPerson = (Person) xstream....
本篇文章将详细介绍如何利用Xstream进行XML的生成和解析。 **一、Xstream简介** Xstream是Java社区中的一款开源库,由Johannes Link创建,它的设计目标是使XML序列化和反序列化变得简单直观。Xstream的核心理念是...
XStream的工作原理是基于反射和类型转换,它可以自动地映射Java类的字段到XML元素,反之亦然。这使得开发者无需编写大量繁琐的代码就能完成XML与Java对象之间的转换。下面我们将深入探讨Xstream的核心概念和使用方法...
本篇文章将深入探讨XStream解析XML的示例,帮助你理解和掌握这一强大的工具。 首先,我们需要理解XStream的基本用法。XStream的核心概念是通过为Java对象定义一个映射,使得对象的字段与XML元素一一对应。这可以...
XStream支持多种XML解析器,包括XPP3和JAXP DOM,用户可以根据性能和兼容性需求选择合适的解析器。例如,使用XPP3时,可以通过`new XStream(newXppDriver())`创建XStream实例;若使用JAXP DOM,则调用`new XStream...
本教程将深入探讨如何使用XStream进行Java类与XML文件之间的互转解析。 首先,我们需要引入XStream库。在Maven项目中,可以在pom.xml文件中添加以下依赖: ```xml <groupId>com.thoughtworks.xstream</groupId> ...
- `xmlpull-1.1.3.1.jar`:XML Pull API,它是轻量级的解析XML的库,用于XPP3。 5. **XML Pull Parsing**: - XML Pull Parsing是一种事件驱动的解析模型,与SAX类似,但更简单,不需要解析器的回调函数。XPP3库...
例如,你可以使用`Document document = DocumentHelper.parseText(xmlString)`来解析XML文本,然后通过`Element root = document.getRootElement()`获取根元素。 3. **xpp3-1.1.4c.jar**: 这个库是XPull解析器的...
XStream会自动解析XML并创建相应的User对象。如果XML结构复杂,包含集合或嵌套对象,XStream也能处理,只需要确保Java Bean的结构与XML匹配即可。 在实际应用中,我们可能需要处理XML中的命名空间、处理特殊的日期...
在描述中提到的`@XStreamAlias`是XStream提供的一个关键注解,用于给Java类或字段指定一个别名,这个别名将在生成的XML中作为元素名称出现。例如: ```java @XStreamAlias("person") public class Person { ...
1. **了解FusionCharts**: 首先,我们需要理解FusionCharts的基本工作原理,包括它如何解析XML数据,以及它支持的各种图表类型和配置选项。这些信息将帮助我们构建符合FusionCharts需求的XML数据结构。 2. **了解...
XStream是一个强大的Java库,它允许开发者方便地将Java对象序列化为XML,同时也能将XML数据反...通过理解和掌握XStream的用法,开发者可以更高效地处理数据序列化需求,无论是在存储、传输还是解析XML文档的场景下。
1. xstream-1.4.jar:这是XStream的主要库文件,包含了所有必要的类和方法,用于实现XML和Java对象的相互转换。 2. kxml2-2.3.0.jar:这是一个轻量级的XML解析器,常被XStream用来作为XML读写的底层实现。KXML2提供...
自定义转换器允许我们在特定情况下控制XML的生成和解析,比如处理复杂的数据类型或自定义的XML格式。命名空间处理则允许我们控制XML元素的命名空间,以满足XML标准或与其他系统集成的需求。 此外,XStream的安全性...
本篇文章将深入探讨如何在Android环境中利用XStream将对象转换成XML。 首先,我们需要理解XStream的基本工作原理。XStream的核心功能是它可以将Java对象直接映射到XML结构,反之亦然。这个过程叫做对象的序列化和反...
JSON(JavaScript Object Notation)则是轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Web服务和前后端交互中,JSON应用广泛。 xStream的核心在于它的“Homoiconic”设计,即代码结构与...
在提供的`AppDemo`文件中,可能包含了一个简单的示例应用,演示了如何在实际项目中使用XStream进行XML和Java对象的转换。通过运行和分析这个例子,你可以更好地理解这一过程,并将其应用到自己的项目中。 总之,...
要将Java对象转换成XML并包含CDATA,我们可以利用如XStream这样的库。XStream是一个简单且功能强大的库,用于将Java对象转换为XML,反之亦然。在上述例子中,我们看到了一个自定义的实现过程,包括三个主要类:...
在Java中,解析XML文件通常有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等方法。然而,这个压缩包中的"xml解析java源代码"主要依赖于XStream库,它提供了一种更简洁...
《XStream4JavaDemo演示源码解析》 XStream是一个用Java编写的开源库,它提供了将Java对象序列化为XML,以及从XML反序列化回Java对象的能力。这个库以其简单易用和强大的功能在Java社区中广受欢迎。本文将通过分析...