Xstream解析Xml
本文只是给自己的加深点映像,每一行代码都是一笔财富,希望能够帮助到大家。
优点
- 优势 高性能,低内存
- 简单api,整洁xml
- 图片链接和图片上传
- 快速输出,能支持json
- 不需要对对象进行过多的操作
- 自定义转换类型
- 支持java对象转xml,XML转对象,对象转json 等
使用地方
-用来转换服务器发送过来的数据
-用来保存数据,保存为xml文件的时候
-一般我们在配置文件的时候也使用,Configuration 配置
-单元测试的时候也可以使用
Xstream
Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁琐。。 —— [ 百度百科 ]
了解Xstream
必须jdk1.5以后才能支持此api
通过注解的方式
如
@XStreamAlias(“name”)
private String name;
对应Xml文件里面的name标签
> <XML>
> `<name>张三</name>`
> </XML>
普通的注解就是给对象的属性取一个别名,也就是我们在xml里面看到的标签名,用于Xsream解析
对于集合也有不同的写法
@XStreamImplicit(itemFieldName=”name”)
private List<String>
name;
对应我们xml里面多个参数
<friend>
<name>张三</name>
<name>李四</name>
<name>王五</name>
</friend>
如果是二级或者是多级菜单,都可以通过上述方式来进行注解
对包含属性的可以采用以下
@XStreamAsAttribute
转换成属性
对应xml中的id
<name
id=”name”>
简单步骤
定义实体类 Student
@XStreamAlias(“name”)
private String name;
@XStreamAlias(“sex”)
private String sex;
//多个对象
@XStreamAlias(“classmate”)
private Contact classmate;
@XStreamAlias(“roommate”)
private Contact roommate;
@XStreamAlias(“soulmate”)
private Contact soulmate;
//朋友集合
@XStreamAlias(“friend”)
private Friend friend;
@XStreamAlias(“game”)
private Game game;
并为他们添加get和set的方法
通过上面的定义出xml的主体结构,各种不同的标签,如果想二级或者多级标签,以同样的方法给其他类注解就可以了,详情可参考demo代码。
Bean2XML
通过采用xstream-1.4.1.jar包的方法进行解析
public static String bean2Xml(Object obj){
XStream xStream=new XStream();
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
}
其中xStream.processAnnotations方法就是帮助解析注解的,没有此方法,就不会识别所有的注解的,必须要加上,同时通过我们的Xstream.toXml()方法就能够解析一个实体类,这个实体类必须要是添加了注解的。如果有些属性或者类没有注解就可能产生的xml标签会是包名
XML2Bean
我们通过传进一个要解析的类型的类数据,以便于能够更好的解析,当然这个类的属性也是需要注解的
public static T Xml2bean(String xmlstr,Class cls){
XStream xStream=new XStream(new DomDriver());
xStream.processAnnotations(cls);
T obj= (T) xStream.fromXML(xmlstr);
return obj;
}
通过上述方式我们就能够解析一个xml数据了,同时我们解析方法xStream.fromXML()支持字符串,字节流,url都是可以支持的。
Mainactivity主界面的代码
代码块
主页面通过赋值调用方法,例如:
public class MainActivity extends AppCompatActivity {
Student student;
Student student3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String xmlStr="<student>" +
" <name>x小芸</name>" +
" <sex>男</sex>" +
" </student>";
initValue();
Student student2= XmlUtils.Xml2bean(xmlStr, student.getClass());
Log.e("xml", student2.getName());
//saveXml();
readFile();
if(student3!=null){
Log.e("xml", student3.getFriend().getName().get(2)+student3.getGame().getLollist().get(0).getExName());
}else{
Log.e("xml", "~~~~~~~~~~");
}
}
private void readFile(){
File sdCard = Environment.getExternalStorageDirectory();
String Filepath=sdCard.getAbsolutePath();
try {
student3= XmlUtils.File2bean(Filepath,"xml33",Student.class);
} catch (Exception e) {
e.printStackTrace();
}finally {
}
}
private void saveXml(){
File sdCard = Environment.getExternalStorageDirectory();
String Filepath=sdCard.getAbsolutePath();
//System.out.println(XmlUtil.toxmlFile(stu, Filepath, "students"));
try {
XmlUtils.bean2File(student,Filepath,"xml33");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void initValue() {
student=new Student();
student.setName("大米粒");
student.setSex("女");
Contact classmate=new Contact();
classmate.setPhone(110);
classmate.setQQnumber(65177722);
Contact roommate=new Contact();
roommate.setPhone(119);
roommate.setQQnumber(65175612);
Contact soulmate=new Contact();
soulmate.setPhone(120);
soulmate.setQQnumber(800058810);
student.setClassmate(classmate);
student.setRoommate(roommate);
student.setSoulmate(soulmate);
List<String> friendlist=new ArrayList<String>();
friendlist.add("不会游泳的鱼");
friendlist.add("无悔这一生");
friendlist.add("空城旧梦");
Friend friend=new Friend();
friend.setName(friendlist);
student.setFriend(friend);
LOL lol=new LOL();
lol.setName("张飞");
lol.setExName("燕人张翼德");
LOL lol2=new LOL();
lol.setName("瑞文");
lol.setExName("放逐之刃");
Game game=new Game();
List<LOL> lolList=new ArrayList<LOL>();
lolList.add(lol);
lolList.add(lol2);
game.setLollist(lolList);
student.setGame(game);
}
解析完成的xml数据
<Student>
<classmate>
<QQnumber>65177722</QQnumber>
<phone>110</phone>
</classmate>
<roommate>
<QQnumber>65175612</QQnumber>
<phone>119</phone>
</roommate>
<soulmate>
<QQnumber>800058810</QQnumber>
<phone>120</phone>
</soulmate>
<friend>
<name>张三</name>
<name>李四</name>
<name>王五</name>
</friend>
<game>
<hero>
<ExName>复仇之矛</ExName>
<name>卡莉斯塔</name>
</hero>
<hero>
<ExName>放逐之仞</ExName>
<name>瑞文</name>
</hero>
</game>
<name>喵</name>
<sex>女</sex>
</Student>
目录
用 [TOC]
来生成目录:
最佳搭配
- 配合Gson能够解析常见的多种数据格式
- JDK1.5以下不支持