XmlPullParser简单教程

官网:

http://www.xmlpull.org

本文参考 :

http://www.xmlpull.org/v1/download/unpacked/doc/quick_intro.html

1. xml文件结构

 xm是一个文档(Document),文档里有多个元素(Element),元素由标签(tag)+子元素或内容组成,标签分头标签和尾标签.

文档(Document)

元素1头标签

  子元素或内容

元素1尾标签.

...

元素n头标签

  子元素n或内容n

元素n尾标签.

2. 解析xml过程

  每到一个标签产生一个事件 ,XmlPullParser有下面几个重要事件:

START DOCUMENT        开始解析事件      

  START_TAG         一个元素标签的开始事件,这时解析该元素的属性值       

    TEXT          解析该元素的内容事件,这时解析该元素的内容值       

  END_TAG          一个元素标签的结束事件 

END_DOCUMENT          解析结束事件      

举例:

<!-- 产生 START DOCUMENT -->
<?xml version="1.0" encoding="utf-8"?>
<lauguages cat="it">        <!-- 产生 START_TAG -->
    <lan id="1">
        <name>              <!-- 产生 START_TAG -->
            Java            <!-- 产生 TEXT -->
        </name>             <!-- 产生 END_TAG -->
        <ide>Eclipse</ide>
    </lan>
    ...
</lauguages>                <!-- 产生 END_TAG -->
<!-- 产生 END_DOCUMENT -->

3.重要的函数

  next,nextTag,getText,nextText,getAttribute...

  详细介绍  http://www.cnblogs.com/cocl/p/4655489.html

4.官方示例与本例中被解析的xml文件

  下载

5.自写示例

5.1 初始化

XmlPullParser parser = Xml.newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in, null);//in是InputStream,指向xml文件流

5.2 遍历

void foreach(InputStream in)throws Exception{
        parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        //现在parser处于 XmlPullParser.START_DOCUMENT
        if (parser.getEventType() == XmlPullParser.START_DOCUMENT) {
            System.out.println("====Start Document====");
        }
        String name = "";
        while ( parser.next() != XmlPullParser.END_DOCUMENT) {
            switch (parser.getEventType()) {
            case XmlPullParser.START_TAG:
                name = parser.getName();
                System.out.println("Start Tag " + name);
                for (int i = 0; i < parser.getAttributeCount(); i++) {
                    System.out.print("< " + name + "> 的属性名:"
                            + parser.getAttributeName(i));
                    System.out.println(" 属性值为: "+parser.getAttributeValue(i));
                }
                break;
            case XmlPullParser.TEXT:
                System.out.println("< " + name + "> 的值:" + parser.getText());
                break;
            case XmlPullParser.END_TAG:
                System.out.println("End Tag " + name);
                break;
            default:
                break;
            }
        }
        //现在parser处于 XmlPullParser.END_DOCUMENT
        if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
            System.out.println("====End Document====");
        }
        int ev = -1;
        parser.next();//到  END_DOCUMENT后就一直是END_DOCUMENT
        ev = parser.next();
        ev = parser.getEventType();
    }

5.3 解析

  /*
     *
     * <entry>
        <id>http://stackoverflow.com/q/9439999</id>
        <re:rank scheme="http://stackoverflow.com">0</re:rank>
        <title type="text">Where is my data file?</title>
        <category scheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags" term="android"/>
        <category scheme="http://stackoverflow.com/feeds/tag?tagnames=android&sort=newest/tags" term="file"/>
        <author>
            <name>cliff2310</name>
            <uri>http://stackoverflow.com/users/1128925</uri>
        </author>
        <link rel="alternate" href="http://stackoverflow.com/questions/9439999/where-is-my-data-file" />
        <published>2012-02-25T00:30:54Z</published>
        <updated>2012-02-25T00:30:54Z</updated>
        <summary type="html">
            <p>I have an Application that requires a data file...</p>
        </summary>
      </entry>
     * 
     */
    public Entry parseEntry() throws XmlPullParserException, IOException {
        Entry entry = new Entry();
        parser.require(XmlPullParser.START_TAG, ns, "entry");//如果不是entry则出异常
        System.out.println("-----------start entry ---------");
        //1.解析entry的属性,本例子中没有 .
        
        //2.解析entry的子元素
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {//从每个element都是从START_TAG事件开始.
                continue;
            }
            String name = parser.getName();
            if (name.equals("id")) {
                /* <id>http://stackoverflow.com/q/9439999</id> */
                parser.next();
                entry.id = parser.getText();
                parser.next();
                //上面3句 可以用一句,
                /*entry.id = parser.nextText();*/
                System.out.println("parser id");
            } else if (name.equals("re:rank")) {
                /* <re:rank scheme="http://stackoverflow.com">0</re:rank> */
                entry.re_rank_scheme = parser.getAttributeValue(null, "scheme");
                entry.re_rank = parser.nextText();
                System.out.println("parser re:rank");
            } else if (name.equals("title")) {
                /* <title type="text">Where is my data file?</title> */
                parseTitle(entry);
                System.out.println("parser title");
            } else if (name.equals("category")) {
                parseCategory(entry);
                System.out.println("parser category");
            } else if (name.equals("author")) {
                parseAuthor(entry);
                System.out.println("parser author");
            } else if (name.equals("link")) {
                parseLink(entry);
                System.out.println("parser link");
            } else if (name.equals("published")) {
                entry.published = parser.nextText();
                System.out.println("parser published");
            } else if (name.equals("updated")) {
                entry.updated = parser.nextText();
                System.out.println("parser updated");
            } else if (name.equals("summary")) {
                parseSummary(entry);
                System.out.println("parser summary");
            }
        };
        parser.require(XmlPullParser.END_TAG, ns, "entry");
        System.out.println("-----------end entry ---------");
        return entry;
    }

 

5.4 只对兴趣元素解析

  /*
     *<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">     
        <title type="tt">newest questions tagged android - Stack Overflow</title>
        <class type="ct">
            <id>15079</id>
            <name>zhang</name>
        </class>
        <school type="st" />
        <entry>
            ...本例只对entry感兴趣
        </entry>
        ...
      </feed>    
     */
    public List<Entry> parseFeed()throws XmlPullParserException, IOException{
        parser.require(XmlPullParser.START_TAG, ns, "feed");
        System.out.println("____________start feed____________");
        //1.解析feed的属性,本例子中没有 .
        
        //2.解析feed的子元素
        while (parser.next() != XmlPullParser.END_TAG) {
            if (parser.getEventType() != XmlPullParser.START_TAG) {
                continue;
            }
            String name = parser.getName();
            if (name.equals("entry")) {// Starts by looking for the entry tag
                entries.add(parseEntry());
            }else{
                skip();//跳过entry同级的其它元素
            }
        }
        parser.require(XmlPullParser.END_TAG, ns, "feed");
        System.out.println("____________end feed____________");
        return entries;
    }

skip函数 

  // Skips tags the parser isn't interested in. Uses depth to handle nested tags. i.e.,
    // if the next tag after a START_TAG isn't a matching END_TAG, it keeps going until it
    // finds the matching END_TAG (as indicated by the value of "depth" being 0).
    private void skip() throws XmlPullParserException, IOException {
        if (parser.getEventType() != XmlPullParser.START_TAG) {
            throw new IllegalStateException();
        }
        int depth = 1;
        while (depth != 0) {
            switch (parser.next()) {
            case XmlPullParser.END_TAG:
                    depth--;
                    break;
            case XmlPullParser.START_TAG:
                    depth++;
                    break;
            }
        }
    }

 

转载于:https://www.cnblogs.com/sjjg/p/4655429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值