android 中xml读写

本文介绍了XML文件的解析方法,包括事件型驱动的SAX和PULL解析,并提供了Android平台上的PULL解析实例代码,同时对比了几种不同的XML解析技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

xml主要分为两类:

事件型驱动    sax、pull 等
    一个标签一个标签的加载,主要是以handler函数为代表,注意维护父子关系。
//以作者愚见,所谓“事件型驱动 ”就是遇到触发点(标签)然后执行你编辑的代码

加载文档   DOM
    一下加载整个文档,然后进行操作
PULL解析XML是Android中自带的解析工具,愚以为一般xml文件都用此便可。所以本文主要讲它,在本文最后还会介绍其他解析方式。

xml(我放在了res/xml下):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <wai name="wai1">
    <!-- 背夹厂商对应包名,不允许轻易修改 -->
    <string name="zhigao">MainActivity1</string>
    <string name="other">MainActivity2</string>
    </wai>
    <wai name="wai2">
    <!-- 背夹厂商对应包名,不允许轻易修改 -->
    <string name="zhigao2">MainActivity1</string>
    <string name="other2">MainActivity2</string>
    </wai>
</resources>
重点方法:(为了方便,下面都是静态方法)

··· java

private static String TAG="main";

public static ArrayList<String> pullParseXml(int resource,
        Context context) {
    XmlResourceParser xmlParser = context.getResources().getXml(resource);
    ArrayList<String> CityArray = new ArrayList<String>();
    String string = null;

    try {
        // 开始解析事件
        int eventType = xmlParser.getEventType();

        // 处理事件,不碰到文档结束就一直处理
        while (eventType != XmlPullParser.END_DOCUMENT) {

            if (eventType == XmlPullParser.START_TAG) {
            if (!xmlParser.getName().equals("resources")) {
                Toast.makeText(context, xmlParser.getAttributeValue(0) + "",
                        Toast.LENGTH_LONG).show();
                if (xmlParser.getName().equals("string")) {
                Log.d("main", xmlParser.nextText());}
            }}
            // 别忘了用next方法处理下一个事件,忘了的结果就成死循环#_#
            eventType = xmlParser.next();
        }
    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return CityArray;
}

public static void writeXml(List<String> persons,OutputStream outStream) throws IllegalArgumentException, IllegalStateException, IOException{  
    XmlSerializer xmlSerializer = Xml.newSerializer();  
    xmlSerializer.setOutput(outStream, "UTF-8");  
    xmlSerializer.startDocument("UTF-8", true);//--><?xml ... ?>  
    xmlSerializer.startTag(null, "persons");  
    for(String person:persons){  

        xmlSerializer.startTag(null, "person");  
        xmlSerializer.attribute(null, "id", person);  
        xmlSerializer.endTag(null, "person");  
    }  
    xmlSerializer.endTag(null, "persons");  
    xmlSerializer.endDocument();  
    outStream.flush();//要刷新缓冲区  
    outStream.close();  
    Log.d(TAG, outStream.toString());  
}  

···

调用的地方:

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

        XmlAnalytic.pullParseXml(R.xml.imate, this);

        List<String> persons=new ArrayList<String>();
        for (int i = 0; i < 5; i++) {
            persons.add(i+"");
        }

        File file=new File(Environment
                .getExternalStorageDirectory().getPath()+"//"+"newmyxml.xml");
        if(!file.isFile()){
        try {
            file.createNewFile();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }}
        Log.d("main", Environment
                .getExternalStorageDirectory().getPath());
        FileOutputStream outStream;
        try {
            outStream = new FileOutputStream(file);
            XmlAnalytic.writeXml(persons, outStream);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

demo:

其他技术比较:
1. DOM4J性能最好,如果你不考虑可移植性,那就采用DOM4J.
2. JDOM和DOM性能测试表现不佳,在测试10M文档时内存溢出,但可移植
3. SAX表现较好,这依赖于特定的解析方式-事件驱动。不全部加载到内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值