您的位置:首页 > 移动开发 > Android开发

android小功能实现之xml文件解析(Pull)

2015-03-04 16:54 489 查看
android解析XML常见的有三种Pull、SAX、Dom三种方式。

最常使用是Pull,Android工程本身解析XML也是用的Pull。

Pull是一个开源项目,其官方网站是:http://xmlpull.org/。

在Android工程中已经集成了Pull项目,可以直接使用。

新建一个Android工程。

一 添加测试文件

在res目录下新建一个raw文件夹,在其中添加文件persons.xml, 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id ="1010">
        <name>A</name>
        <age>10</age>
    </person>
    <person id ="1111">
        <name>B</name>
        <age>11</age>
    </person>
</persons>


二 布局

打开main.xml修改内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/content" />
</LinearLayout>


用于显示从xml中解析出来的数据。

三 添加实体类

新建一个Person类,保存读出来的数据,类容如下:

public class Person {
    private Integer id;
    private String name;
    private Integer age;

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

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

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

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


四 功能实现

新建一个类PersonService,用于解析XML,完整代码如下:

public class PersonService {
    /**
     * 获取对象列表
     *
     * @param inStream xml文件输入流
     * @return 对象列表
     * @throws Exception
     */
    public List<Person> getPersons(InputStream inStream) throws Exception {
        XmlPullParser parser = Xml.newPullParser();
        try {
            parser.setInput(inStream, "UTF-8");
            int eventType = parser.getEventType();
            Person currentPerson = null;
            List<Person> persons = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:  // 文档开始事件,可以进行数据初始化处理
                        persons = new ArrayList<Person>();
                        break;

                    case XmlPullParser.START_TAG:       //开始读取某个标签
                        //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
                        if (parser.getName().equalsIgnoreCase("person")) {
                            currentPerson = new Person();
                            currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
                        }
                        else if (currentPerson != null) {
                            String name = parser.getName();
                            if (parser.getName().equalsIgnoreCase("name")) {
                                currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
                            } else if (name.equalsIgnoreCase("age")) {
                                currentPerson.setAge(new Integer(parser.nextText()));
                            }
                        }
                        break;

                    case XmlPullParser.END_TAG:// 结束元素事件
                        if (parser.getName().equalsIgnoreCase("person") && currentPerson != null) {
                            persons.add(currentPerson);
                            currentPerson = null;
                        }
                        break;
                }
                eventType = parser.next();
            }
            inStream.close();
            return persons;
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}


五 测试代码

修改MainActivity.java代码如下:

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

        try {
            // 测试用:读取文件内容
            // String str = "xml文件内容:\n";
            // str += this.read("person.xml");

            InputStream xml = getResources().openRawResource(R.raw.persons);
            String str = "xml文件内容:\n";
            PersonService service = new PersonService();
            List<Person> persons = service.getPersons(xml);
            for(Person person :persons) str = str + person.toString() + "\n";
            xml.close();

            TextView textView = (TextView)findViewById(R.id.content);
            textView.setText(str);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    public String read(String name) throws  Exception{
        InputStream is = getResources().openRawResource(R.raw.persons);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int len = 0;
        while( (len = is.read(buf)) != -1){
            os.write(buf,0, len);
        }
        byte[] data = os.toByteArray();
        String content = new String(data);
        return  content;
    }


六 运行结果

如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: