XmlPullParser 与 XmlSerializer

Posted _seem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XmlPullParser 与 XmlSerializer相关的知识,希望对你有一定的参考价值。

 

XmlSerializer与XmlPullParser的使用实践:

先贴代码:

1.利用eclipse生成一个默认的工程;

2.修改布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/btn_product"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="生成XML" />

    <Button
        android:id="@+id/btn_pull"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="解析XML" />

</LinearLayout>

3.MainActivity.java修改

package com.example.testxml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

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

import android.R.integer;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    private Button btn_product;
    private Button btn_pull;
    private List<Person> personInfo = null;

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

        btn_product = (Button) findViewById(R.id.btn_product);
        btn_pull = (Button) findViewById(R.id.btn_pull);

        btn_product.setOnClickListener(this);
        btn_pull.setOnClickListener(this);
    }

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

        switch (v.getId()) {
        case R.id.btn_product:
            String exState = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(exState)) {
                File exDirectory = Environment.getExternalStorageDirectory();
                saveToSdCard(exDirectory + "/test.xml");
            } else {
                return;
            }

            break;
        case R.id.btn_pull:

            String exState1 = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(exState1)) {
                File exDirectory = Environment.getExternalStorageDirectory();
                getXmlInfo(exDirectory + "/test.xml");

                for (Person i : personInfo) {
                    Log.i("TAG", i.toString());
                }

            } else {
                return;
            }

            break;
        }
    }

    private void getXmlInfo(String dir) {
        // TODO Auto-generated method stub

        try {
            Person person = null;
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            FileInputStream input = new FileInputStream(dir);

            xpp.setInput(input, "UTF-8");
            int eventType = xpp.getEventType();

            while (XmlPullParser.END_DOCUMENT != eventType) {

                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    personInfo = new ArrayList<Person>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("Persons".equals(xpp.getName())) {

                    } else if ("person".equals(xpp.getName())) {
                        person = new Person();
                        String attri = xpp.getAttributeName(0); // 获取属性名称
                        if ("id".equals(attri)) {
                            String id = xpp.getAttributeValue(0); // 获取属性名称的值
                            person.setId(id);
                        }
                    } else if ("name".equals(xpp.getName())) {

                        person.setName(xpp.nextText());
                    } else if ("age".equals(xpp.getName())) {

                        person.setAge(xpp.nextText());
                    } else if ("score".equals(xpp.getName())) {
              //实际就是把xpp.nextText拆分成了两步而已
                        xpp.next();
                        if (xpp.getEventType() == XmlPullParser.TEXT)
                            person.setScore(xpp.getText());
                    }
                    break;
                case XmlPullParser.END_TAG:

                    if ("person".equals(xpp.getName())) {
                        personInfo.add(person);
                    }
                    break;
                }

                eventType = xpp.next();
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private void saveToSdCard(String dir) {
        // TODO Auto-generated method stub

        XmlSerializer xml = Xml.newSerializer();
        try {
            int i;
            FileOutputStream ouput = new FileOutputStream(dir);
            xml.setOutput(ouput, "UTF-8");

            xml.startDocument(null, true);

            xml.startTag(null, "Persons");

            for (i = 0; i < 10; i++) {
                xml.startTag(null, "person");
                xml.attribute(null, "id", Integer.toString(i));

                xml.startTag(null, "name");
                xml.text("张" + i);
                xml.endTag(null, "name");

                xml.startTag(null, "age");
                xml.text("10" + i);
                xml.endTag(null, "age");

                xml.startTag(null, "score");
                xml.text("60" + i * 2);
                xml.endTag(null, "score");

                xml.endTag(null, "person");
            }

            xml.endTag(null, "Persons");

            xml.endDocument();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

4.Person.java

package com.example.testxml;

public class Person {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    private String name;
    private String age;
    private String score;

    public Person() {
        name = null;
        age = null;
        score = null;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", score=" + score
                + "]";
    }

}

 

实践过程中遇到的问题:

1.XmlPullParser解析器的内容获取:

XmlPullParser.START_DOCUMENT :XML解析的开始标志<?xml version="1.0" encoding="UTF-8" standalone="true"?>

XmlPullParser.START_TAG :节点标签 <Persons>

XmlPullParser.END_TAG: 节点结束标签</Persons>

XmlPullParser.TEXT :节点之间内容的标签 <age>100</age>也就是100这个内容值;具体使用详见上面代码;

XmlPullParser.END_DOCUMENT: XML解析结束标志</Persons>“ ”,引号之间存在一个结束的内容;

2.ArrayList当中内容存储的方式:

List<Person> personInfo = new ArrayList<Person>()

通过personInfo.add(person)去添加内容到数组列表时,person添加到数组并非像C当中一样将内容拷贝到数组列表,而类似于指针建立了一个指向关系;

因此如果每次添加的person都是同一个,那么数组列表中的内容值会被替换成最后添加的内容;

 

以上是关于XmlPullParser 与 XmlSerializer的主要内容,如果未能解决你的问题,请参考以下文章

XmlPullParser:如何找出 START_TAG 是啥?

Android:如何获取 TAG 的值:使用 XmlPullParser

XML的XmlPullParser解析

如何使用xmlpullparser解析android中的汉字

xmlPullParser的使用

给定 XmlPullParser 作为输入,如何创建 LayoutInflater?