安卓中xml的读取与生成

文档背景:
安卓界面activity:
一个textview两个按钮
生成button和解析button

本文档主要通过实例将xml的读取和生成过程

详细“翻译”;

package com.example;

import android.os.Bundle;
import android.util.Xml;

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button bt1;
private Button bt2;
private TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setView();
    setListeners();
}

private void setView() {
    // TODO Auto-generated method stub
    bt1 = (Button) findViewById(R.id.button1);
    bt2 = (Button) findViewById(R.id.button2);
    tv= (TextView) findViewById(R.id.textView1);
}

private void setListeners() {
    // TODO Auto-generated method stub
    bt1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            jiexi();
        }
    });
    bt2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            shengcheng();
        }
    });
}

protected void shengcheng() {//解析自定义的生成方法;此方法生成   
    // TODO Auto-generated method stub
    try {           //try catch捕捉错误信息;
        FileOutputStream out = //文件输出流out
                 new FileOutputStream(
                 "/sdcard/e.xml");//将文件输出流接入sd卡中的e.xml 文件上;准备向e输出数据;
                XmlSerializer s = //序列化器 s,用来生成xml文件;
                 Xml.newSerializer();
                s.setOutput(out, "GBK");//序列化器s的输出端口接入out,输出指定的GBK格式的输出流;
                s.startDocument("GBK", true); //序列化器头部公文标记格式为GBK,是独立文件;
                s.startTag(null, "email")//序列化器输出开始标签,命名空间选择默认null;名字叫email;
                 .attribute(null, "date", "2016-10-29")//的属性(命名空间为null,日期属性设置为2016-10-29)
                 .attribute(null, "time", "16:5:12")//的属性(命名空间null,时间属性设置为16:5:12)
                 .startTag(null, "from")//的开始标签(命名空间为null,标签内容是from)
                 .text("[email protected]")//开始标签的文字内容是[email protected]
                 .endTag(null, "from")//的结束标签(命名空间为null,标签内容是from
                 )
                 .startTag(null, "to")//开始标签....to
                 .startTag(null, "to-email")//标签嵌套,表明to标签中的内容是以下几个“toemail”收件人标签
                 .text("[email protected]")
                 .endTag(null, "to-email")

                 .startTag(null, "to-email")
                 .text("[email protected]")
                 .endTag(null, "to-email")

                 .startTag(null, "to-email")
                 .text("[email protected]")
                 .endTag(null, "to-email")

                 .endTag(null, "to")//承接上面的to开始标签,此时完成to标签;

                 .startTag(null, "subject")//标题subject的开始标签
                 .text("Hello Xml!")//此标签的内容是hello xml
                 .endTag(null, "subject")//标题的结束尾标签
                 .startTag(null, "body")//正文名为body的开始标签
                 .text(">>>Hello Xml!<<<>>>Hello Xml!<<<>>>Hello Xml!<<<")//内容为。。。
                 .endTag(null, "body")//body的结束
                 .endTag(null, "email");//序列化器email的输出结束

                s.flush();
                out.close();


        Toast.makeText(this, "生成成功", 0).show();
    } catch (Exception e) {
        // TODO: handle exception
        Toast.makeText(this, "生成失败", 0).show();
        e.printStackTrace();
    }
}

protected void jiexi() {
    // TODO Auto-generated method stub
    try {
        tv.setText("");//清空textview;
        FileInputStream in=new FileInputStream("/sdcard/email.xml");//找到sd卡中的xml文件;
        XmlPullParser p=Xml.newPullParser();//创建新的解析器p
        p.setInput(in,"GBK");//设置读取xml数据输入流
        int type;
        while((type=p.next())!=XmlPullParser.END_DOCUMENT){//当p的next()不是数据流的end时!=1时;
            if(type==XmlPullParser.START_TAG){//如果是数据解析流的开始标签时
                String name=p.getName();// 获取标签的名字
                if(name.equals("email")){//如果标签名等于email;
                    String d=p.getAttributeValue(null, "date");//获得email的date属性值
                    String t=p.getAttributeValue(null, "time");//获得email的time属性值
                    tv.append("\nDate:"+d);//在tv里换行显示“date:“+d
                    tv.append("\nTime:"+t);//在tv里换行显示“Time:”+t
                }else if(name.equals("from")){//如果标签名是from;
                    tv.append("\n发件人:"+p.nextText());//tv里换行显示:发件人+标签名向后跳一步所取得的文本;
                }else if(name.equals("to-email")){//如果标签名=to-email
                    tv.append("\n收件人:"+p.nextText());//tv换行显示收件人+标签名后的文本;
                }else if(name.equals("subject")){//如果标签名=subject;
                    tv.append("\n标题:"+p.nextText());//tv换行显示标题+标题标签名下的文本;
                }else if(name.equals("body")){//如果标签名是body
                    tv.append("\n内容:"+p.nextText()); //tv里换行显示内容标签下的文本;
                }
            }
        }
        in.close();

        Toast.makeText(this, "解析完成", 0).show();
    } catch (Exception e) {
        // TODO: handle exception
        Toast.makeText(this, "解析失败", 0).show();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

你可能感兴趣的:(元)