Android之深入理解xml数据的pull解析

对于xml数据的解析方式我们应该重点掌握Pull方式的解析方法,如果你刚开始学习xml数据的解析方式或者掌握的不够牢固,那么来吧,我带你深入理解掌握pull方式的解析方法!
首先你要清楚,pull解析是基于事件的解析,pull解析有如下几个重要的解析事件
1. int START_DOCUMENT = 0;
2. int END_DOCUMENT = 1;
3. int START_TAG = 2;
4. int END_TAG = 3;

以上四个就是我认为pull解析中比较重要的四个解析事件及其在源码中的常量值。接下来简单说明一下
1. START_DOCUMENT 开始解析文档
2. int END_DOCUMENT 结束解析文档
3. int START_TAG 开始解析标签
4. END_TAG 结束解析标签

对于学过的这当然没什么难的,但是如果刚入手可能不明白这都是什么意思啊,不急,我们继续。
接下来首先要说的是关于xml数据,既然我们是要解析xml数据的,所以我们需要有一个xml数据,我们这里以解析本地xml数据为例,新建一个文本文档改名“data.xml”,在里面书写如下内容

<student>
    <student1>
        <name>张三</name>
        <age>25</age>
    </student1>

    <student1>
        <name>李四</name>
        <age>23</age>
    </student1>
</student>

以上就是一份xml数据了,接下来我们就对这份xml数据进行解析,另外这里的解析指的是什么呢?我们这里说的解析是指拿到xml数据中的name和age的值。接下来我们在实际的代码中去展示如何一步步通过pull去解析xml数据的。
新建一个项目PullDemo,切换到Project下在main下新建一个文件夹命名assets,然后将我们创建的xml数据data.xml放到这个文件夹下。

准备工作完成之后我们开始一步步去解析xml数据,接下来我们主要在MainActivity中操作代码,首先我们使用pull去解析xml数据,所以肯定需要一个解析器,那么我们就来创建一个解析器

 //1.获得xml数据解析器
        XmlPullParser parser = Xml.newPullParser();

这行代码就成功创建了一个解析器parser,接下来很多地方都要用到他。有了解析器,下一步就是准备xml数据了,我们提前已经创建好了xml数据,现在的的问题是如何将数据与解析器关联起来并开始解析呢?我们可以通过如下代码来完成

 //2.获得数据
InputStream stream = this.getAssets().open("data.xml");
 //3.开始解析
parser.setInput(stream,"utf-8");

通过上述两行代码我们就将xml数据与解析器关联了起来并且开始解析了,接下来我们将解析的过程通过代码的方式一步步分解来让你彻底明白xml数据是如何通过pull解析的,我们是如何得到我们想要的值的。

还记得开篇提到得解析事件吗?在实际得解析过行程中我们就是通过判断不同的解析事件去执行代码的,所以我们先要获得解析事件。

//4.得到当前解析事件
            int event = parser.getEventType();

解析事件到底是什么呢?不急我们通过代码验证一下,看看这个event到底是什么。

 //4.得到当前解析事件
            int event = parser.getEventType();
            System.out.println(event);
            10-29 15:32:50.524 28592-28592/com.ithuangqing.pulldemo I/System.out: 0

我这里为了展示将输出结果和代码放在一起了,我们发现这个event的值是0.还记得开篇说的这几个常量值吗!
1. int START_DOCUMENT = 0;
2. int END_DOCUMENT = 1;
3. int START_TAG = 2;
4. int END_TAG = 3;

没错,这里的0就是指的START_DOCUMENT,这个常量表示的是开始解析文档,在接下来的操作中请你务必熟记这几个常量值以及其代表的含义。另外说一点关于xml数据的问题,在xml数据中<>这样的叫做开标签,

 //得到标签名字
            String codeName = parser.getName();

通过此方法我们就可以读取到标签的名字,接下来在代码中实际展示下。

//4.得到当前解析事件
            int event = parser.getEventType();
            System.out.println(event);
            //得到标签名字
            String codeName = parser.getName();
            System.out.println(codeName);
10-29 15:45:14.261 8641-8641/com.ithuangqing.pulldemo I/System.out: 0
10-29 15:45:14.261 8641-8641/com.ithuangqing.pulldemo I/System.out: null

我们可以看到,当开始解析文档执行到事件0,此时还没有开始读取标签,所以标签的名字是null,此时事件停留在0,那么我们如何执行下一个事件呢?可以通过如下代码将事件下移

 parser.next();

此时我们再来看看当前的事件是什么

 //4.得到当前解析事件
            int event = parser.getEventType();
            System.out.println(event);
            //得到标签名字
            String codeName = parser.getName();
            System.out.println(codeName);
            event = parser.next();
            System.out.println(event);
10-29 15:54:05.813 16924-16924/com.ithuangqing.pulldemo I/System.out: 0
10-29 15:54:05.813 16924-16924/com.ithuangqing.pulldemo I/System.out: null
10-29 15:54:05.813 16924-16924/com.ithuangqing.pulldemo I/System.out: 2

可以看到此时已经开始执行事件2了,还记得2代表什么吗?当事件执行到了2就代表开始解析标签读取开标签的名字了,我们看我们的data.xml中第一个开标签的名字是student,我们来获取下此时的标签名字看看是不是student。

event = parser.next();
            System.out.println(event);
            System.out.println(parser.getName());
10-29 15:57:54.573 20854-20854/com.ithuangqing.pulldemo I/System.out: 2
10-29 15:57:54.573 20854-20854/com.ithuangqing.pulldemo I/System.out: student

正如我们所看到的,此时读取到的正是student,那么pull的解析有什么样的规律呢?pull解析xml数据遵循从上到下从左到右,我们就xml数据来详细说一下,先来看如下xml数据

<student>
    <student1>
        <name>张三</name>
        <age>25</age>
    </student1>

    <student1>
        <name>李四</name>
        <age>23</age>
    </student1>
</student>

当执行到0的时候代表开始解析文档,此时没有标签,所以标签名字为空,接下来执行到事件2代表开始解析标签,这个时候会解析这个开标签,此时我们可以拿到标签的名字student,当解析事件下移会开始解析到后面的属性值,此时的事件是3(可以在XmlPullParser类中具体查看),所以没有标签得到的标签名同样为空,紧接着执行到3,此时会解析属性值后面的闭标签,没有的话同样为空,再继续就会重新回到事件2开始解析这个开标签,也就是说,pull解析会按照<开标签>属性值<闭标签>的顺寻解析,并且是从上至下的,你可以在代码中写上如下代码

//3.开始解析
            parser.setInput(stream,"utf-8");
            //4.得到当前解析事件
            int event = parser.getEventType();
            System.out.println(event);
            //得到标签名字
            String codeName = parser.getName();
            System.out.println(codeName);
            event = parser.next();
            System.out.println(event);
            System.out.println(parser.getName());

            event = parser.next();
            System.out.println(event);
            System.out.println(parser.getName());

            event = parser.next();
            System.out.println(event);
            System.out.println(parser.getName());

            event = parser.next();
            System.out.println(event);
            System.out.println(parser.getName());

也就是多写几个下移事件,一步步的分解者去看其是如何解析的,输出如下

10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 0
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: null
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 2
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: student
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 4
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: null
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 2
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: student1
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 4
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: null
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 2
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: name
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 4
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: null
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 3
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: name
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: 4
10-29 16:10:40.046 1482-1482/com.ithuangqing.pulldemo I/System.out: null

以上我们详细介绍了pull是如何解析xml数据的,接下来我们来看看整体的代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void click(View view){
        //1.获得xml数据解析器
        XmlPullParser parser = Xml.newPullParser();
        //2.获得数据
        try {
            InputStream stream = this.getAssets().open("data.xml");
            //3.开始解析
            parser.setInput(stream,"utf-8");
            //4.得到当前解析事件
            int event = parser.getEventType();

            String name = "";
            String  age = "";
            while (event != XmlPullParser.END_DOCUMENT){
                //5.得到标签名字
                String nodeName = parser.getName();
             switch (event){
                 case XmlPullParser.START_TAG:{
                     if ("name".equals(nodeName)){
                         name = parser.nextText();
                     }else if ("age".equals(nodeName)){
                         age = parser.nextText();
                     }
                     break;
                 }
                 case XmlPullParser.END_TAG:{
                     if ("student1".equals(nodeName)){
                         System.out.println("名字是:"+name+"--"+"年龄是:"+age);
                     }
                     break;
                 }
                 default:
                     break;
             }
                //6.获得下一个解析事件
               event =  parser.next();
            }

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

    }
}

输出结果为

10-29 16:32:38.665 21804-21804/com.ithuangqing.pulldemo I/System.out: 名字是:张三--年龄是:25
10-29 16:32:38.665 21804-21804/com.ithuangqing.pulldemo I/System.out: 名字是:李四--年龄是:23

好了以上就是关于xml数据的pull解析了,由于本人入门不久且都是自学,若有不当之处望请见谅还希望多指教,如果能帮到你我很高兴,谢谢!

posted @ 2017-10-29 16:50  ithuangqing  阅读(131)  评论(0编辑  收藏  举报