Andoid之Xml解析与反解析

本文详细介绍了Android中XML的解析与反解析过程,包括如何导入XML字符串进行解析,创建文件,控件绑定,使用parse方法解析以及利用pull方法反解析成XML字符串。适合Android开发者学习XML操作。

 1.第一步:导入一个xml字符串,进行解析:

package com.cn.day12xml;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import Bean.App;
import utils.MyXMLPullUtils;

public class MainActivity extends AppCompatActivity {
    private MyXMLPullUtils myXMLPullUtils;
    /**
     * 一、創建xml文件:
     */
    String xmlString = "<apps>\n" +
            "<app>\n" +
            "\t    <id>1</id>\n" +
            "\t\t<name>google map</name>\n" +
            "\t\t<version>1.0</version>\n" +
            "\t</app>\n" +
            "\t\n" +
            "\t <app>\n" +
            "\t    <id>2</id>\n" +
            "\t\t<name>google play</name>\n" +
            "\t\t<version>2.0</version>\n" +
            "\t</app>\n" +
            "\t\n" +
            "\t<app>\n" +
            "\t    <id>3</id>\n" +
            "\t\t<name>chrome</name>\n" +
            "\t\t<version>3.0</version>\n" +
            "\t</app>\n" +
            "\t\n" +
            "</apps>";

2.第二步:创建文件步骤:

  private TextView tv1;
    private TextView tv2;
    OutputStream outputStream;
    List<App> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        App app=new App();
        for(int i=0;i<3;i++){
            app.setId(i);
            app.setName("app"+i);
            app.setVersion(i);
            list.add(app);
        }
        Log.i("zzzz",list.toString());
//        parseXMLWithPull(xmlString);

        try {
            String baseUrl= Environment.getExternalStorageDirectory().toString();
            String path=baseUrl+ File.separator+"apps.xml";
            File file=new File(path);
            outputStream=new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        MyXMLPullUtils myXMLPullUtils=new MyXMLPullUtils(outputStream,list);
        try {
            myXMLPullUtils.save();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 3.第三步:控件绑定:

  private void initView() {
        tv1 = (TextView) findViewById(R.id.tv1);
        tv2 = (TextView) findViewById(R.id.tv2);
    }

  4.第四步:用parse方法解析字符串:

  /**
     * 二、用parse方法來解析字符串:
     * 1.创建一個解析工厂 factory :newInstance()
     * 2.获取单个的解析类:factory.newPullParser()
     * <p>
     * 3.读取raeader字符串:StringReader
     * 4.设置解析的数据源:xmlPullParser.setInput()
     * 5.获取事件类型 eventType:xmlPullParser.getEventType()
     * <p>
     * 6.解析过程:
     * 1>首先设置解析范围:至xml文件文档结束的位置:XmlPullParser.END_DOCUMENT
     * 2>其次,获取其每个标题名称: xmlPullParser.getName()
     * 3>根据获取的标题依次进行查询:
     * 4>查到最后输出结果
     * 5>设置游标向下移动
     *
     * @param xmlString
     */
    private void parseXMLWithPull(String xmlString) {
        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser xmlPullParser = factory.newPullParser();

            StringReader stringReader = new StringReader(xmlString);
            xmlPullParser.setInput(stringReader);
            int eventType = xmlPullParser.getEventType();
            //设置获取到的信息属性:
            String id = "";
            String name = "";
            String version = "";
            //循环读取:
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String xmlname = xmlPullParser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG://起始标签
                        if ("id".equals(xmlname)) {
                            id = xmlPullParser.nextText();
                        } else if ("name".equals(xmlname)) {
                            name = xmlPullParser.nextText();
                        } else if ("version".equals(xmlname)) {
                            version = xmlPullParser.nextText();
                        }
                        break;
                    case XmlPullParser.END_TAG://结束标签
                        if ("app".equals(xmlname)) {
                            Log.i("xmlname", "id: " + id + " name: " + name + " version: " + version);
                            tv1.setText("id: "+id+ " name: " +name+ " version: "+version);
                        }
                        break;
                }
                //游标滑动
                eventType = xmlPullParser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

  5.第五步:用pull方法反解析成xml字符串:

package utils;

import android.util.Log;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

import Bean.App;

public class MyXMLPullUtils {
    /**
     * 一、创建读取流OutPutStream + 对象
     *     进行解析:
     * */
    OutputStream os = null;
    List<App> list = null;

    public MyXMLPullUtils(OutputStream os, List<App> list) {
        this.os = os;
        this.list = list;
    }
    /**
     * 二、解析过程:
     * 1.创建工厂
     * 2.实现factory.newSerializer()方法
     * 3.使用输出流将序列化的XML输出到指定位置
     *
     * 4.开启文档
     * 5.开始标签
     *
     * 6.通过遍历集合进行解析:
     *      startDocument——endDocument
     *      startTag——endTag
     * 7.释放+关闭流:
     */
    public void save() throws Exception{
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        XmlSerializer xmlSerializer = factory.newSerializer();
        xmlSerializer.setOutput(this.os,"UTF_8");

        xmlSerializer.startDocument("UTF_8",true);
        xmlSerializer.startTag(null,"apps");

        //遍历器:
        Iterator<App> iterator = this.list.iterator();
        while (iterator.hasNext()){
            App app = iterator.next();
            xmlSerializer.startTag(null,"app");

            xmlSerializer.startTag(null,"id");
             xmlSerializer.text(app.getId() + "");
            xmlSerializer.endTag(null,"id");

            xmlSerializer.startTag(null,"name");
            xmlSerializer.text(app.getName()+"");
            xmlSerializer.endTag(null,"name");

            xmlSerializer.startTag(null,"version");
            xmlSerializer.text(app.getVersion()+"");
            xmlSerializer.endTag(null,"version");

            xmlSerializer.endTag(null,"app");


        }
        xmlSerializer.endTag(null,"apps");
        xmlSerializer.endDocument();

        //释放+关闭流:
        xmlSerializer.flush();
        os.flush();
        os.close();

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值