android 67 生成和解析xml-阿里云开发者社区

开发者社区> 开发与运维> 正文

android 67 生成和解析xml

简介:

生成xml:

复制代码
package com.itheima.createxml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import com.itheima.createxml.domain.Message;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    List<Message> smsList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //虚拟10条短信
        smsList = new ArrayList<Message>();
        for(int i = 0; i < 10; i++){
            Message sms = new Message("小志好棒" + i, System.currentTimeMillis() + "", "138"+i+i, "1");
            smsList.add(sms);
        }
    }

    public void click(View v){
        //在内存中把xml备份短信的格式拼接出来,短信保存在外部,因为应用删除后要短信还在。
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
        sb.append("<messages>");
        for (Message sms : smsList) {//拼接每一条短信sms
            sb.append("<sms>");
            
            sb.append("<body>");
            sb.append(sms.getBody());
            sb.append("</body>");
            
            sb.append("<date>");
            sb.append(sms.getDate());
            sb.append("</date>");
            
            sb.append("<type>");
            sb.append(sms.getType());
            sb.append("</type>");
            
            sb.append("<address>");
            sb.append(sms.getAddress());
            sb.append("</address>");
            
            sb.append("</sms>");
        }
        sb.append("</messages>");
        
        File file = new File("sdcard/sms.xml");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(sb.toString().getBytes());
            fos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
复制代码

生成xml:

复制代码
package com.itheima.xmlserializer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import com.itheima.createxml.domain.Message;

import android.os.Bundle;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    List<Message> smsList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 虚拟10条短信
        smsList = new ArrayList<Message>();
        for (int i = 0; i < 10; i++) {
            Message sms = new Message("小志好棒" + i, System.currentTimeMillis()
                    + "", "138" + i + i, "1");
            smsList.add(sms);
        }
    }

    public void click(View v){
        //使用xml序列化器生成xml文件
        //1.拿到序列化器对象
        XmlSerializer xs = Xml.newSerializer();
        //2.初始化路径和文件名,生成在sd卡中,
        File file = new File("sdcard/sms2.xml");
        try {
            FileOutputStream fos = new FileOutputStream(file);
            //enconding:指定用什么编码生成xml文件,安卓默认就是utf-8,所以几乎所有的编码都是utf-8,
            xs.setOutput(fos, "utf-8");
            
            //utf-8指定头结点<message>中的enconding的值enconding="utf-8",true指定是否是独立的xml文件,
            xs.startDocument("utf-8", true);
            
            xs.startTag(null, "message");//开始节点的名字<message>,null为namespace,
            
            for (Message sms : smsList) {
                xs.startTag(null, "sms");
                
                xs.startTag(null, "body");
                xs.text(sms.getBody() + "<body>");//text表示文本节点
                xs.endTag(null, "body");
                
                xs.startTag(null, "date");
                xs.text(sms.getDate());
                xs.endTag(null, "date");
                
                xs.startTag(null, "type");
                xs.text(sms.getType());
                xs.endTag(null, "type");
                
                xs.startTag(null, "address");
                xs.text(sms.getAddress());
                xs.endTag(null, "address");
                
                xs.endTag(null, "sms");
            }
            
            xs.endTag(null, "message");//结束节点
            
            //告诉序列化器,文件生成完毕
            xs.endDocument();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

}
复制代码

解析xml:

复制代码
package com.itheima.pullparser;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.itheima.pullparser.domain.City;

import android.os.Bundle;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    List<City> cityList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View v){
        //获取到src文件夹下的资源文件
        InputStream is = getClassLoader().getResourceAsStream("weather.xml");//获取资源作为流
        
        //拿到pull解析器对象
        XmlPullParser xp = Xml.newPullParser();
        //初始化
        try {
            xp.setInput(is, "gbk");//第一个是输入流,gbk是解析编码,gbk是windows的默认编码格式,所以weather.xml的编码格式是gbk
            
            //获取当前节点的事件类型,通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
            //解析是一行一行的解析的,
            int type = xp.getEventType();
            City city = null;
            while(type != XmlPullParser.END_DOCUMENT){//文档结束节点
                //根据节点的类型,要做不同的操作
                switch (type) {
                case XmlPullParser.START_TAG://开始节点
                    //                    获取当前节点的名字
                    if("weather".equals(xp.getName())){
                        //创建city集合对象,用于存放city的javabean
                        cityList = new ArrayList<City>();
                    }
                    else if("city".equals(xp.getName())){
                        //创建city的javabean对象
                        city = new City();
                    }
                    else if("name".equals(xp.getName())){
                        String name = xp.nextText();//获取当前节点的下一个节点的文本就是QQ,nextText并把指针移到当前节点的结束节点,
                        city.setName(name);
                    }
                    else if("temp".equals(xp.getName())){
                        //                获取当前节点的下一个节点的文本
                        String temp = xp.nextText();
                        city.setTemp(temp);
                    }
                    else if("pm".equals(xp.getName())){
                        //                获取当前节点的下一个节点的文本
                        String pm = xp.nextText();
                        city.setPm(pm);
                    }
                    break;
                case XmlPullParser.END_TAG://结束节点,<name>QQ</name>遇到</name>什么都不做,遇到QQ文本节点什么都不做,
                    if("city".equals(xp.getName())){
                        //把city的javabean放入集合中
                        cityList.add(city);
                    }
                    break;

                }
                
                //把指针移动到下一个节点,并返回该节点的事件类型,前一个结束节点和后一个开始节点会有一个换行符,换行符是一个文本节点,
                type = xp.next();
            }
            
            for (City c : cityList) {
                System.out.println(c.toString());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
/*
 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<weather>
    <city>
        <name>QQ</name>
        <temp>5</temp>
        <pm>80</pm>
    </city>
    <city>
        <name>rr</name>
        <temp>-5</temp>
        <pm>800</pm>
    </city>
    <city>
        <name>����</name>
        <temp>12��</temp>
        <pm>60</pm>
    </city>
</weather>*/
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4926331.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章