• 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();//指针下移
        }
    }    
     
  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5263087.html
Copyright © 2020-2023  润新知