zoukankan      html  css  js  c++  java
  • XML_PULL解析

    一、在Android应用中的XML文件来源

    1、本地xml文件
        本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等;
    除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourceParer:XmlResourceParer是XmlPullParser的子类),其它位置情况都可以获取XML文档,返回一个Inputstream对象,进行读取数据,获取方法分别如下:
    a.在res/xml目录下(推荐使用):
    [java] view plain copy
    1. XmlResourceParser xmlParser = this.getResources().getXml(R.xml.XXX);  
    b.在res/xml、res/raw目录下:
    [java] view plain copy
    1. InputStream inputStream = this.getResources().openRawResource(R.xml.XXX);  
    c.在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<?xml version="1.0" encoding="utf-8"?>,否则解析报错,具体原因未查明,知道原因请回复交流):
    [java] view plain copy
    1. InputStream inputStream = getResources().getAssets().open(fileName);  
    d.在应用指定目录下(SDcard,应用data目录等):
    [java] view plain copy
    1. // path路径根据实际项目修改,此次获取SDcard根目录  
    2. String path = Environment.getExternalStorageDirectory().toString();  
    3. File xmlFlie = new File(path+fileName);  
    4. InputStream inputStream = new FileInputStream(xmlFlie);  

    二、应用

    1.获取XmlPullParser对象

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//先获取XmlPullParserFactory实例
    XmlPullParser xmlPullParser = factory.newPullParser();//利用XmlPullParserFactory对象获取XmlPullParser对象

    2.载入文件并解析的原理

    /*载入文件*/
    String s = "xml文档数据";
    StringReader sr = new StringReader(s);//将数据转换成流
    xmlPullParser.setInput(sr);//将数据放入XmlPullParser对象进行解析

    解析原理:

    就像有根手指放在文档上,逐步处理START_TAG,END_TAG和END_DOCUENT不同的XML节点事件。

    START_TAG:当手指放在标签的头部时

    END_TAG:当手指放在标签的尾部时

    END_DOCUMENT:当手指到达文章的尾部的时候

    3.进行解析并获取解析数据

    XmlPullParser解析有几个主要方法(属性值:<div id="" name="">节点的内容</div>   id and name就是节点属性值。。。 )

    a.XmlPullParser.getEventType() : 【获取当前事件回调类型】
    b.XmlPullParser.getName():【获取当前节点名字】
    c.XmlPullParser.getAttributeValue(int index):【根据id获取节点属性值】
    d.XmlPullParser.getAttributeValue(String namespace, String name):【根据name获取节点属性值】
    注解:namespace
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <persons  
    3.     xmlns:yd="http://www.china-mobile.com"  
    4.     xmlns:lt="http://www.china-unicome.com">  
    5.     some_content  
    6.     <person index="1">  
    7.         <name>yuanzhifei89</name><age>100</age><married>false</married>  
    8.         <!-- 移动号码 --><yd:phone yd:id="amj08102">12345678</yd:phone>  
    9.         <!-- 联通号码 --><lt:phone lt:id="cmk35203">87654321</lt:phone>  
    10.         Namespace的作用两个都是phone类型的标签,所以需要指定namespace来确定。
    11.         <![CDATA[&lt;&gt; <div>]]>&lt;  
    12.     </person>  
    13. </persons>  
    e.XmlPullParser.nextText():【在回调节点START_TAG时,通过此方法获取节点全部内容】
     
    XmlPullParser移动“手指”的方法:parser.next();
     

    4.实例

    private static final String XML_PEOPLE = "people";
    
    public void parseItems(String xmlData){
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//创建Xml工厂
        XmlPullParser parser = factory.newParser();//创建Xml解析器
        StringReader sr = new StringReader(xmlData);//将xml数据转换成reader流
        parser.setInput(sr);//将数据放入解析器
        int eventType = parser.next();//指针下移,获取回调事件类型
        While(eventType != XmlPullParser.END_DOCUMENT){ //得到xml数据最后退出循环
          if (eventType == XmlPullParser.START_TAG && XML_PEOPLE.equals(parser.getName())){//事件为文章头部并且标签名为需要标签
            String name = parser.getAttributeValue(null,"name")//没有namespace就填null,获取属性为name的值
            String weight = parser.getAttributeValue(nuill,"weight")//获取属性为weight的值
        }
            eventType = parser.next();//指针下移
        }
    }    
     
  • 相关阅读:
    递归 迷宫问题
    中缀表达式转后缀表达式
    栈实现后缀表达式计算

    单向环形链表
    站在巨人的肩上
    C#自宿主API,不依赖IIS
    MySQL 安装失败解决办法
    第一话
    村上春树《眠》读书笔记
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5263087.html
Copyright © 2011-2022 走看看