XStream解析XML

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]来生成目录:

最佳搭配

  1. 配合Gson能够解析常见的多种数据格式
  2. JDK1.5以下不支持

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值