android XML数据解析详解

来源:互联网 发布:最好视频播放软件 编辑:程序博客网 时间:2024/06/11 03:58

引言:
在这个大数据时代,每当我们调用第三方的API接口时,就会涉及到以何种方式接受返回的数据,官网提供的方式有两种:JSONXML。前面小编已经介绍过JSON数据,在这再来讲解一下XML,即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XMLXSLXPath等。

XML是一种数据的描述语言,虽然它是语言,但是通常情况下,它并不具备常见语言的基本功能——被计算机识别并运行。只有依靠另一种语言,来解释它,使它达到你想要的效果或被计算机所接受。
记住以下几点就行了:
XML是一种标记语言,很类似HTML
XML的设计宗旨是传输数据,而非显示数据
XML标签没有被预定义。您需要自行定义标签。
XML被设计为具有自我描述性。
XMLW3C的推荐标准

总结:

XML是独立于软件和硬件的信息传输工具。 目前,XMLWeb中起到的作用不会亚于一直作为 Web 基石的 HTMLXML无所不在。XML是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。

1.1 XML属性

1.1.1 XML与HTML的主要差异
XML不是HTML的替代。
XMLHTML为不同的目的而设计。
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而 XML 旨在传输信息

1.1.2 XML是不作为的

也许这有点难以理解,但是XML不会做任何事情。XML被设计用来结构化、存储以及传输信息。
下面是一个案例:

<p p_id = "03">    <pn>天津</pn>        <c c_id="0301"><cn>天津</cn>                <d d_id="101030100">天津</d>                <d d_id="101030200">武清</d>                <d d_id="101030300">宝坻</d>                <d d_id="101030400">东丽</d>                <d d_id="101030500">西青</d>                <d d_id="101030600">北辰</d>                <d d_id="101030700">宁河</d>                <d d_id="101030800">汉沽</d>                <d d_id="101030900">静海</d>                <d d_id="101031000">津南</d>                <d d_id="101031100">塘沽</d>                <d d_id="101031200">大港</d>                <d d_id="101031400">蓟县</d>            </c>        </p>

上面的这些标签具有自我描述性,它仅仅是包装在XML标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

1.1.3 XML仅仅是纯文本

XML没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以XML。 不过,能够读XML的应用程序可以有针对性地处XML的标签。标签的功能性意义依赖于应用程序的特性。

1.4 XML允许自定义标签标签

上例中的标签没有在任何XML标准中定义过(比如和)。这些标签是由文档的创作者发明的。这是因为XML没有预定义的标签。
HTML中使用的标签(以及HTML的结构)是预定义的。HTML文档只使用在HTML标准中定义过的标签(比如<p>,<h1>等等)。XML允许创作者定义自己的标签和自己的文档式化并显据。

1.1.5 XML不是对HTML的替代

XML是对HTML的补充。
XML不会替代HTML,理解这一点很重要。在大多数 web 应用程序中,XML用于传输数据,而HTML用于格式化并显示数据。

1.2 XML的语法

1.2.1 所有元素都必须有关闭标签

    <p p_id = "02">    <pn>上海</pn>        <c c_id="0201"><cn>上海</cn>                <d d_id="101020100">上海</d>                <d d_id="101020200">闵行</d>                <d d_id="101020300">宝山</d>                <d d_id="101020500">嘉定</d>                <d d_id="101020600">浦东南汇</d>                <d d_id="101020700">金山</d>                <d d_id="101020800">青浦</d>                <d d_id="101020900">松江</d>                <d d_id="101021000">奉贤</d>                <d d_id="101021100">崇明</d>                <d d_id="101021200">徐家汇</d>                <d d_id="101021300">浦东</d>            </c>        </p>

1.2.2 XML标签对大小写敏感

(1)、错误的

    <P p_id = "02">    <PN>上海</pn>        <C c_id="0201"><cn>上海</cn>                <D d_id="101020100">上海</d>                <D d_id="101020200">闵行</d>                <D d_id="101020300">宝山</d>                <D d_id="101020500">嘉定</d>                <D d_id="101020600">浦东南汇</d>                <D d_id="101020700">金山</d>                <D d_id="101020800">青浦</d>                <D d_id="101020900">松江</d>                <D d_id="101021000">奉贤</d>                <D d_id="101021100">崇明</d>                <D d_id="101021200">徐家汇</d>                <D d_id="101021300">浦东</d>            </C>        </P>

(2)、正确的

    <p p_id = "02">    <pn>上海</pn>        <c c_id="0201"><cn>上海</cn>                <d d_id="101020100">上海</d>                <d d_id="101020200">闵行</d>                <d d_id="101020300">宝山</d>                <d d_id="101020500">嘉定</d>                <d d_id="101020600">浦东南汇</d>                <d d_id="101020700">金山</d>                <d d_id="101020800">青浦</d>                <d d_id="101020900">松江</d>                <d d_id="101021000">奉贤</d>                <d d_id="101021100">崇明</d>                <d d_id="101021200">徐家汇</d>                <d d_id="101021300">浦东</d>            </c>        </p>

1.2.3 XML文档必须有根元素

XML文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。

<citylist>    <p p_id = "01">    <pn>北京</pn>    <c c_id="0101"><cn>北京</cn>        <d d_id="101010100">北京</d>        <d d_id="101010200">海淀</d>        <d d_id="101010300">朝阳</d>        <d d_id="101010400">顺义</d>        <d d_id="101010500">怀柔</d>        <d d_id="101010600">通州</d>        <d d_id="101010700">昌平</d>        <d d_id="101010800">延庆</d>        <d d_id="101010900">丰台</d>        <d d_id="101011000">石景山</d>        <d d_id="101011100">大兴</d>        <d d_id="101011200">房山</d>        <d d_id="101011300">密云</d>        <d d_id="101011400">门头沟</d>        <d d_id="101011500">平谷</d>    </c>    </p></citylist>

1.2.4 XML的属性值须加引号
(1)、错误的

    <p p_id = 02>    <pn>上海</pn>        <c c_id=0201><cn>上海</cn>                <d d_id=101020100>上海</d>                <d d_id=101020200>闵行</d>                <d d_id=101020300>宝山</d>                <d d_id=101020500>嘉定</d>                <d d_id=101020600>浦东南汇</d>                <d d_id=101020700>金山</d>                <d d_id=101020800>青浦</d>                <d d_id=101020900>松江</d>                <d d_id=101021000>奉贤</d>                <d d_id=101021100>崇明</d>                <d d_id=101021200>徐家汇</d>                <d d_id=101021300>浦东</d>            </c>        </p>

(2)、正确的

    <p p_id = "02">    <pn>上海</pn>        <c c_id="0201"><cn>上海</cn>                <d d_id="101020100">上海</d>                <d d_id="101020200">闵行</d>                <d d_id="101020300">宝山</d>                <d d_id="101020500">嘉定</d>                <d d_id="101020600">浦东南汇</d>                <d d_id="101020700">金山</d>                <d d_id="101020800">青浦</d>                <d d_id="101020900">松江</d>                <d d_id="101021000">奉贤</d>                <d d_id="101021100">崇明</d>                <d d_id="101021200">徐家汇</d>                <d d_id="101021300">浦东</d>            </c>        </p>

1.2.5 XML中的注释

在 XML 中编写注释的语法与 HTML 的语法很相似:

    <!--<p p_id = "02">    <pn>上海</pn>        <c c_id="0201"><cn>上海</cn>                <d d_id="101020100">上海</d>                <d d_id="101020200">闵行</d>                <d d_id="101020300">宝山</d>                <d d_id="101020500">嘉定</d>                <d d_id="101020600">浦东南汇</d>                <d d_id="101020700">金山</d>                <d d_id="101020800">青浦</d>                <d d_id="101020900">松江</d>                <d d_id="101021000">奉贤</d>                <d d_id="101021100">崇明</d>                <d d_id="101021200">徐家汇</d>                <d d_id="101021300">浦东</d>            </c>        </p>-->

1.3 XML解析

1.3.1 XML三种解析方法
DOM解析方法
SAX解析方法
PULL解析方法
1.3.2 XML三种方法对比
DOM解析方法:
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
SAX解析方法:
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
PULL解析方法:
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
1.3.3 XML-PULL详解
这里只对PULL解析器做详细讲解,剩下的两种待日后再给大家慢慢道来
解析案例:

<p p_id = "03">    <pn>天津</pn>        <c c_id="0301"><cn>天津</cn>                <d d_id="101030100">天津</d>                <d d_id="101030200">武清</d>                <d d_id="101030300">宝坻</d>                <d d_id="101030400">东丽</d>                <d d_id="101030500">西青</d>                <d d_id="101030600">北辰</d>                <d d_id="101030700">宁河</d>                <d d_id="101030800">汉沽</d>                <d d_id="101030900">静海</d>                <d d_id="101031000">津南</d>                <d d_id="101031100">塘沽</d>                <d d_id="101031200">大港</d>                <d d_id="101031400">蓟县</d>            </c>        </p>

详细解析方法:

    /**     * 解析XML文件     * @param xml     * @return     */    public static Map<String, String> listparserXml(XmlResourceParser xml) {        Log.i(TAG, "==listparserXml()");        // 定义一个Map容器对象,用于存储解析的键值对        Map<String, String> map = null;        try {            // 保存XML文件            XmlPullParser pullParser = xml;            // 产生第一个事件             int event = pullParser.getEventType();            // 定义一个保存省得变量            String provinceName = null;            // 定义一个保存城市的名称            String cityName = null;            // 判断是不是第一次读取地区名            boolean firstFlag = true;            // 还没有到XML文档结尾            while (event != XmlResourceParser.END_DOCUMENT) {                 switch (event) {                // 判断当前事件是否是文档开始事件                 case XmlResourceParser.START_DOCUMENT:                             // 初始化map集合                      map = new HashMap<String, String>();                    break;                case XmlResourceParser.START_TAG:    // 如果是开始标签                    // 如果得到的是"pn"标签                    if ("pn".equals(pullParser.getName())) {                        // 将标签对应的省保存到变量provinceName里面                        provinceName = pullParser.nextText();                    }                    // 如果得到的是"cn"标签                    if ("cn".equals(pullParser.getName())) {                        // 将第一读标记设置为ture                        firstFlag = true;                        // 将标签对应的城市保存到变量cityName里面                        cityName = pullParser.nextText();                    }                    // 如果得到的是"d"标签                    if ("d".equals(pullParser.getName())) {                        // 将第一个属性的值                        String id = pullParser.getAttributeValue(0);                        // 得到起后面的值                        String areaName = pullParser.nextText();                        // 是第一次保存地区名和id                        if (firstFlag) {                            // 将地区和省组合起来充当键值                            areaName = areaName + "-" + provinceName;                        } else {                            // 将地区,城市名称和省名称组合起来充当键值                            areaName = areaName + "-" + cityName + "-"                                    + provinceName;                        }                        // 将该键值跟对应的id号绑定在一起                        map.put(areaName, id);                        // 将标记还原                        firstFlag = false;                    }                    break;                }                // 进入下一个元素并触发相应事件                 event = pullParser.next();            }        } catch (Exception e) {            Log.i(TAG, "==解析异常");            e.printStackTrace();        }        Log.i(TAG, "map==" + map);        return map;    }

数据使用技巧:
(1)、获取请求的数据

    /**     * 初始化能用到的数据     */    private void initData() {        if (cityAllMap == null) {            // 获取XML里面的数据            cityAllMap = PullParserHelper.listparserXml(this.getResources()                    .getXml(R.xml.citys_weather));        }    }

(2)、如何使用请求回的数据

/**     * 适配listView     * @param inputStr为城市名称     */    private void listViewAdapter(String inputStr) {        // 用于展示结果的list        List<String> list = new ArrayList<String>();        // 遍历XML解析出来的数据        for (String strKey : cityAllMap.keySet()) {            // 如果搜索文本框的内容不为null且不能空,且XML里面包含这个城市            if (inputStr != null && !"".equals(inputStr)                    && strKey.contains(inputStr)) {                // 满足包含输入框中输入的文字内容的,进行添加展式                 list.add(strKey);            }        }        // 为用户查询的适配器添加数据        uSearchAdapter = new Weather_User_Search_Adapter(list, this, inputStr);        // 将改适配器绑定到要显示的listView上面        listView_user_search_person.setAdapter(uSearchAdapter);    }
0 0
原创粉丝点击