您的位置:首页 > 编程语言 > Java开发

xml转为javaBean

2016-01-04 17:22 387 查看
1.Xstream简介;

使用限制:JDK版本不能<1.5.

虽然预处理注解是安全的,但自动侦查注解可能发生竞争条件.

特点:

简化的API;

无映射文件;

高性能,低内存占用;

整洁的XML;

不需要修改对象;支持内部私有字段,不需要setter/getter方法,final字段;非公有类,内部类;类不需要默认构造器,完全对象图支持.维护对象引用计数,循环引用.i

提供序列化接口;

自定义转换类型策略;

详细的错误诊断;

快速输出格式;当前支持JSON和morphing.

使用场景

Transport转换

Persistence持久化对象

Configuration配置

UnitTests单元测

隐式集合

当我们使用集合类时不想显示集合,只显示里面的元素即可.

使用隐式集合前:

<list>

<element/>

<element/>

<list>

使用隐式集合:

xstream.addImplicitCollection(Person.class,"list");

使用隐式集合后:

<element/>

<element/>

2.Xstream注解常用知识:

@XStreamAlias("message")别名注解

作用目标:类,字段

@XStreamImplicit隐式集合(例如list集合)

@XStreamImplicit(itemFieldName="part")

作用目标:集合字段

@XStreamConverter(SingleValueCalendarConverter.class)注入转换器

作用目标:对象

@XStreamAsAttribute转换成属性

作用目标:字段

@XStreamOmitField忽略字段

作用目标:字段

Auto-detectAnnotations自动侦查注解

xstream.autodetectAnnotations(true);

自动侦查注解与XStream.processAnnotations(Class[]cls)的区别在于性能.自动侦查注解将缓存所有类的类型.

3.案例分析:(1)同一标签下多个同名元素;

(2)同一标签下循环多个对象;

案例:

import
java.util.List;


import
com.thoughtworks.xstream.annotations.XStreamAlias;

import
com.thoughtworks.xstream.annotations.XStreamImplicit;


/**

*@ClassName:PersonBean

*@author:
chenyoulongEmail:chen.youlong@payeco.com

*@date
:2012-9-28下午3:10:47

*@Description:TODO

*/

@XStreamAlias
(
"person"
)

public
class
PersonBean
{

@XStreamAlias
(
"firstName"
)

private
String
firstName;

@XStreamAlias
(
"lastName"
)

private
String
lastName;


@XStreamAlias
(
"telphone"
)

private
PhoneNumber
tel;

@XStreamAlias
(
"faxphone"
)

private
PhoneNumber
fax;


//测试一个标签下有多个同名标签

@XStreamAlias
(
"friends"
)

private
Friends
friend;


//测试一个标签下循环对象

@XStreamAlias
(
"pets"
)

private
Pets
pet;



//省略setter和getter

}


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

1

2

3

4

5

6

7

8

9

10
@XStreamAlias
(
"phoneNumber"
)

public
class
PhoneNumber{

@XStreamAlias
(
"code"
)

private
int
code;

@XStreamAlias
(
"number"
)

private
String
number;


//省略setter和getter


}


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26
/**

*
用Xstream注解的方式实现:一个标签下有多个同名标签

*@ClassName:Friends

*@author:
chenyoulongEmail:chen.youlong@payeco.com

*@date
:2012-9-28下午4:32:24

*@Description:TODO
5个name中国,美国,俄罗斯,英国,法国

*http://blog.csdn.net/menhuanxiyou/article/details/5426765

*/

public
static
class
Friends{

@XStreamImplicit
(itemFieldName=
"name"
)
//itemFieldName定义重复字段的名称,

/*<friends>
<friends>

<name>A1</name>
<String>A1</String>

<name>A2</name>
如果没有,则会变成=====><String>A1</String>

<name>A3</name>
<String>A1</String>

</friends>
</friends>

*/

private
List<String>
name;


public
List<String>
getName(){

return
name;

}


public
void
setName(List<String>
name){

this
.name
=name;

}

}


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14
//测试同一标签下循环某一对象

public
class
Animal{

@XStreamAlias
(
"name"
)

private
String
name;

@XStreamAlias
(
"age"
)

private
int
age;

public
Animal(String
name,
int
age){

this
.name=name;

this
.age=age;

}


//省略setter和getter

}



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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20
/**

*
测试同一标签下循环某一对象

*@ClassName:Pets

*@author:
chenyoulongEmail:chen.youlong@payeco.com

*@date
:2012-9-28下午6:26:01

*@Description:TODO

*/

public
class
Pets{

@XStreamImplicit
(itemFieldName=
"pet"
)

private
List<Animal>
animalList;


public
List<Animal>
getAnimalList(){

return
animalList;

}


public
void
setAnimalList(List<Animal>
animalList){

this
.animalList
=animalList;

}


}


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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61
import
com.thoughtworks.xstream.XStream;

import
com.thoughtworks.xstream.io.json.JsonWriter.Format;

import
com.thoughtworks.xstream.io.xml.DomDriver;


/**

*@ClassName:PersonTest

*@author:
chenyoulong

*@date
:2012-9-28下午3:25:09

*@Description:TODO

*/

public
class
PersonTest
{


/**

*
@Title:main

*
@Description:TODO

*
@paramargs

*
@returnvoid

*/

public
static
void
main(String[]
args){

//
TODOAuto-generatedmethodstub


PersonBean
per=
new
PersonBean();

per.setFirstName(
"chen"
);

per.setLastName(
"youlong"
);


PhoneNumber
tel=
new
PhoneNumber();

tel.setCode(
137280
);

tel.setNumber(
"137280968"
);


PhoneNumber
fax=
new
PhoneNumber();

fax.setCode(
20
);

fax.setNumber(
"020221327"
);

per.setTel(tel);

per.setFax(fax);



//测试一个标签下有多个同名标签

List<String>
friendList=
new
ArrayList<String>();

friendList.add(
"A1"
);

friendList.add(
"A2"
);

friendList.add(
"A3"
);

Friends
friend1=
new
Friends();

friend1.setName(friendList);

per.setFriend(friend1);


//测试一个标签下循环对象

Animal
dog=
new
Animal(
"Dolly"
,
2
);

Animal
cat=
new
Animal(
"Ketty"
,
2
);

List<Animal>
petList=
new
ArrayList<Animal>();

petList.add(dog);

petList.add(cat);

Pets
pet=
new
Pets();

pet.setAnimalList(petList);

per.setPet(pet);


//java对象转换成xml

String
xml=XmlUtil.toXml(per);

System.out.println(
"xml==="
+xml);


}

}


7.[代码]xml效果图

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
xml===<person>

<firstName>chen</firstName>

<lastName>youlong</lastName>

<telphone>

<code>
137280
</code>

<number>
137280968
</number>

</telphone>

<faxphone>

<code>
20
</code>

<number>
020221327
</number>

</faxphone>

<friends>

<name>A1</name>

<name>A2</name>

<name>A3</name>

</friends>

<pets>

<pet>

<name>doly</name>

<age>
2
</age>

</pet>

<pet>

<name>Ketty</name>

<age>
2
</age>

</pet>

</pets>

</person>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: