Android网络编程之Pull解析XML文件

XML:

——使用原始XML资源—放在/res/xml目录下有时Android应用有一些初始化的配置信息,

应用相关的数据资源需要保存,一般推荐使用xml文件来保存,这种资源就被称为原始的XML资源。

——访问原始XML资源:R.xml.file_name

        在java程序中获取实际XML文档,可以通过Resource的如下两个方法获取:

              XmlResourceParser.getResource.getXml(int):获取XMl文档并使用XmlPullParser来解析该XML文档该方法返回一个解析器对象。

              InputStream openRawResource(int)获取xml文档对应的输入流

        此外还可以使用下面的方式创建PULL解析器对象:

              XmlPullParser parser = Xml.newPullParser();//得到Pull解析器

              parser.setInput(instream,"UTF-8");//设置下输入流的编码

    int eventType = parser.getEventType();//得到第一个事件类型

   

PULL解析;

       Android默认使用内置的Pull解析器来解析xml文件。虽然SAX和DOM解析也能用,推荐使用pull解析。Pull解析类似于SAX解析,都采用事件驱动方式来进行解析。

       原理:不断地调用Pull解析器的next方法获取下一个解析事件的类型,根据事件类型判断是否读取到文件的尾部。当处于某个元素处时,可调用getAttributeValue()方法获取该元素的属性值,也可调用nextText()获取文本节点的值。调用getName()获取标签名。

       事件类型有:

       PULL解析器调用该getEventType()返回事件类型。

      XmlPullParser.END_DOCUMENT  文档解析结束

      XmlPullParser.START_DOCUMENT 文档开始解析

      XmlPullParser.START_TAG    解析到开始标签

      XmlPullParser.END_TAG      解析到结束标签

 

 

       解析xml文件所有人的信息,放到集合中。



import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private XmlResourceParser xmlResourceParser;
    private List<Book> books;
    private Book book;

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

        textView = (TextView) findViewById(R.id.tv);
        xmlResourceParser = getResources().getXml(R.xml.books);

    }

    public void start(View view) {

        try {
            //获得事件类型
            int type = xmlResourceParser.getEventType();

            while (type != XmlPullParser.END_DOCUMENT) {
                switch (type) {

                    case XmlResourceParser.START_DOCUMENT:
                        Toast.makeText(this, "开始解析", Toast.LENGTH_SHORT).show();
                        books = new ArrayList<>();
                        break;
                    case XmlPullParser.START_TAG:
                        if ("book".equals(xmlResourceParser.getName())) {
                            book = new Book();
                            //getAttributeValue()是获得<book id="1">中的id属性
                            String id = xmlResourceParser.getAttributeValue(null, "id");
                            book.setId(id);
                        }

                        if (book != null) {
                            if ("name".equals(xmlResourceParser.getName())) {
                                book.setName(xmlResourceParser.nextText());
                            }
                            if ("author".equals(xmlResourceParser.getName())) {
                                book.setAuthor(xmlResourceParser.nextText());
                            }
                            if ("year".equals(xmlResourceParser.getName())) {
                                book.setYear(xmlResourceParser.nextText());
                            }
                        }

                        break;
                    case XmlPullParser.END_TAG:
                        if ("book".equals(xmlResourceParser.getName())) {
                            books.add(book);
                            book = null;
                        }
                        break;
                }
                type = xmlResourceParser.next();
            }
            Toast.makeText(this, "解析完毕", Toast.LENGTH_SHORT).show();
            textView.setText(books.toString());


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}


<?xml version="1.0" encoding="utf-8"?>
<books>

    <book id="1">
        <name>冰与火之歌</name>
        <author>乔治.马丁</author>
        <year>2011</year>
    </book>

    <book>
        <name>安徒生童话</name>
        <author>安徒生</author>
        <year>2014</year>
    </book>

    <book>
        <name>Android疯狂讲义</name>
        <author>李刚</author>
        <year>2000</year>
    </book>


</books>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值