android XMLPullParser读取xml文件

由于刚学Android,用的开发工具是Android studio,没用过eclipse的那个开发Android,所以针对有些说由于2个IDE的路径不通导致的文件读取不到,不做分析(实际上是没法分析eclipse里的),这个博文只针对AS用户。

我们的资源文件,除了放到res目录下之外,还可以放在跟java 、res同级的asserts(新建的)目录里。

今天要解析的这个xml就是在这个目录下的。

首先说一下xmlpullparser,这个pull解析是基于事件的模式。比如

读取到xml的开始声明内容,那么就会触发START_DOCUMENT,返回一个int类型数据;

读取到xml的结束内容,那么触发END_DOCUMENT,返回一个int类型数据

读取到xml的开始标签,返回START_TAG,

读取到xml的结束标签,返回END_TAG,

读取到xml的文本返回TEXT

读取标签后,可以获取该标签的属性值与文本值

下面这个例子讲解的xml在附件中的getWeatherByCityName.xml.

下面开始讲步骤:

1、获取assets里面的资源文件的输入流。  这里在AS中可以通过AssetManager来获取,即第一行代码的方式。也可以通过第二行的方式获取这个输入流

2、声明xmlPullParser并给输入流指明编码方式。

3、定义一个xmlpullParser获取到的事件类型,eventType。

4、开始循环解析,如果没有碰到END_DOCUMENT,那么就一直往下走;取出节点是string的tag里的文本内容并放入到list里,作为后面处理。

5、一定要注意,要加上eventType=xmlPullParser.next();不然的话循环会一直读取xml的第一个节点,即START_DOCUMENT而不往下执行,导致死循环。

 InputStream inputStream = getAssets().open("getWeatherbyCityName.xml");
// InputStream inputStream = getClass().getClassLoader().getResourceAsStream("assets/"+"getWeatherbyCityName.xml");
 XmlPullParser xmlPullParser = Xml.newPullParser();
 xmlPullParser.setInput(inputStream,"utf-8");

 List<String> infosList=new ArrayList<String>();
 int eventType=xmlPullParser.getEventType();
 while(eventType!=XmlPullParser.END_DOCUMENT){
     if ("string".equals(xmlPullParser.getName())){
         String info=xmlPullParser.nextText();
         infosList.add(info);
     }
     eventType=xmlPullParser.next();
 }

下面讲一个比较常见的xml格式的文件读取里面的内容:

这个xml对应的xml是附件中的info2.xml

需要注意的是xml文件的格式正确。之前由于从网上拷贝了一个xml文本内容,结果xml莫名的各种红线,调试下面的程序时,报xml格式错误,就手写了一个xml,编译器不报错了,才调试好。

里面讲解的StudentBean 只是一个简单的有3个私有属性的类,id,name,age,带上get/set方法

package com.yuanlp.pulldemo2;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Xml;

import com.yuanlp.pulldemo2.bean.StudentBean;

import org.xmlpull.v1.XmlPullParser;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       List<StudentBean> list=click();
       for(StudentBean student : list){
           System.out.println("+++++++++<><>>>>>>>>>>>id是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getId());
           System.out.println("+++++++++<><>>>>>>>>>>>年龄是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getAge());
           System.out.println("+++++++++<><>>>>>>>>>>>名字是>>>>>>>>>>>>>>>>>>>>>>>>"+student.getName());
       }
    }

    public List<StudentBean> click(){
        try {
            InputStream inputStream=getAssets().open("info2.xml");
            XmlPullParser xmlPullParser= Xml.newPullParser();
            xmlPullParser.setInput(inputStream,"utf-8");
            StudentBean student=null;
            List<StudentBean> studentlist=null;

            int eventType=xmlPullParser.getEventType();
            while(eventType!=XmlPullParser.END_DOCUMENT){

                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        studentlist=new ArrayList<StudentBean>();
                        break;
                    case XmlPullParser.START_TAG:
                        //从这个start节点到下一个end节点,读取到的属性都属于一个student,所以在此声明一个student,并将这个节点取到的数据放入到这个student中
                        //通过getName()判断读到哪里,然后通过nextText()获取值,或者通过getAttributeValue获取属性值
                        String tagName=xmlPullParser.getName();
                        if (tagName.equalsIgnoreCase("person")){
                            student=new StudentBean();
                            student.setId(xmlPullParser.getAttributeValue(null,"id"));
                        }else if (student!=null){
                            if (tagName.equalsIgnoreCase("name")){
                                student.setName(xmlPullParser.nextText());
                            }else if (tagName.equalsIgnoreCase("age")){
                                student.setAge(xmlPullParser.nextText());
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG: //结束标签
                        //如果读取到结束标签,而且这个结束标签是person的话,就把student放入到list,并把student置null,方便下个循环重新声明
                        if (xmlPullParser.getName().equalsIgnoreCase("person")&&student!=null){
                            //读完一个person,可以将他放入到list中
                            studentlist.add(student);
                            student=null;
                        }

                }
                eventType=xmlPullParser.next();

            }
              inputStream.close();
            return  studentlist;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
时间: 06-14

android XMLPullParser读取xml文件的相关文章

Android开发学习---使用XmlPullParser解析xml文件

Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1 一.创建一个XML项目,步骤如下: 二.解析一个xml文件: assets/person.xml <?xml version="1.0" encodi

C#读取XML文件的基类实现

刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到结合之前所做的XML操作,完成了一个能够读取XML文件的基类,便于以后的使用. PS:即使再老套的代码,目前也不敢进行优化,一是水平不行,二是不敢. 使用静态扩展类,扩展了几个经常使用的类型,能够方便数据的读写. 操作XML的类,可以直接继承BaseL

Excel开发学习笔记:读取xml文件及csv文件

读取xml文件 有好多种读取xml的方式,xmlDOM比较常见,我使用了另外一种,它以数据流的方式打开文件并读取内容 Imports System.Xml  Dim group As New List(Of String)  Using reader As XmlReader = XmlReader.Create(OpenFileDialog2.FileName)      While reader.ReadToFollowing("group")          reader.Mo

读取XML文件的指定节点的值 并转换为Item

cmb_State_Send.ItemsSource = null; XmlDocument doc = new XmlDocument(); doc.Load("D:\\模板\\WorkstationState_Config.xml"); //加载Xml文件 XmlElement rootElem = doc.DocumentElement; //获取根节点 XmlNode xn = rootElem.SelectSingleNode("//Workstation[@Nam

Java使用相对路径读取xml文件

java使用相对路径读取xml文件 博客分类: java javaXMLJavaWeb 一.xml文件一般的存放位置有三个: 1.放在WEB-INF下: 2.xml文件放在/WEB-INF/classes目录下或classpath的jar包中: 3.放在与解析它的java类同一个包中,不一定是classpath: 二.相对应的两种使用相对路径的读取方法: 方法一:(未验证) 将xml文件放在WEB-INF目录下,然后 程序代码: InputStream is=getServletContext(

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问

C# 读取xml文件忽略xml文件的注释

默认情况下,读取xml文件是不忽略注释的,这样读取带注释的节点会造成异常,那么怎么屏蔽掉这些注释呢? 方案如下: XmlDocument doc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; //xmlFilePath:xml文件路径 XmlReader reader = XmlReader.Create(xmlFilePath,

DataSet - DataTable - DataRow 读取 xml 文件 + 搜索

DataSet ds = XmlHelper.GetDataSetByXml(AppDomain.CurrentDomain.BaseDirectory + "/Config/ConfigName.xml");//取得xml文件 DataTable dt = ds.Tables["table_Name"];//取得xml文件的节点内容 DataRow[] dr = dr = ds.Tables["table_Name"].Select("

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基