Android的XML文件解析之PULL解析

简介: Android的XML文件解析之PULL解析

Android的XML文件解析之PULL解析

      我是一个在校大学生,对安卓的学习完全是出于兴趣,因此,只能靠自己自学,有写的不好的地方希望大家多多包涵。

首先说明本人写博客的目的,完全是为了对自己Android学习的总结,如果文章对你的学习和工作有所帮助,本人不胜荣幸。

当然,要解析XML文件,首先要有一个XML文件,下面我们自己新建一个XML文件,就以example.xml来命名一个文件。文件内容如下:

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<persons>
  <person id="001">
   <name>fnhfire7030</name>
   <age>21</age>
  </person>
  <person id="002">
   <name>fnhfire7030</name>
   <age>23</age>
  </person>
</persons>

然后我们就要建立一个解析器来解析XML文件,这里我们命名为PullXMLTools.java,具体内容如以下代码:

<pre name="code" class="java">package com.study.xiaohui.myapplication.parse;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by xiaohui on 2016/3/2.
 * 建立一个解析XML文件的类
 */
public class PullXMLTools {
    public List<PullXMLInfo> parseXML(InputStream inputStream, String encode) throws XmlPullParserException, IOException {
        List<PullXMLInfo> list = null;
        PullXMLInfo pullXMLInfo = null;
        //建立解析工厂
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //获得XML文件的引用
        XmlPullParser pullParser = factory.newPullParser();
        //从服务器下载XML文件,以流的形式返回,设定解析XML文件的编码格式
        pullParser.setInput(inputStream, encode);
        int eventType = pullParser.getEventType();
        //对XML文件进行解析
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    list = new ArrayList<PullXMLInfo>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("person".equals(pullParser.getName())) {
                        pullXMLInfo = new PullXMLInfo();
                        int id = Integer.parseInt(pullParser.getAttributeValue(0));
                        pullXMLInfo.setId(id);
                    } else if ("name".equals(pullParser.getName())) {
                        String name = pullParser.nextText();
                        pullXMLInfo.setName(name);
                    } else if ("age".equals(pullParser.getName())) {
                        int age = Integer.parseInt(pullParser.nextText());
                        pullXMLInfo.setAge(age);
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("person".equals(pullParser.getName())) {
                        list.add(pullXMLInfo);
                        pullXMLInfo = null;
                    }
                    break;
            }
            eventType = pullParser.next();
        }
        return list;
    }
}

当然解析时,我们要定义一个实体类方便解析,我把实体类命名为PullXMLInfo.java,内容如下:

<span style="font-size:18px;">package com.study.xiaohui.myapplication.parse;
/**
 * Created by xiaohui on 2016/3/2.
 */
public class PullXMLInfo {
    public int id = 0;
    public String name = null;
    public int age = 0;
    public PullXMLInfo(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public PullXMLInfo() {
    }
    @Override
    public String toString() {
        return "PullXMLInfo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
</span>

 因为我的XML文件是在我的tomcat中,因此需要写一个下载XML文件的方法,这里我自己重新定义了一个Downloader的类,里面的内容如下:

package com.study.xiaohui.myapplication.downloader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
 * Created by xiaohui on 2016/3/2.
 * 从本机下载XML文件
 */
public class DownLoader {
    private URL url = null;
    public InputStream downloader(String str) {
        InputStream inputStream = null;
        try {
            url = new URL(str);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            //设置连接超时的时间
            connection.setConnectTimeout(3000);
            connection.setDoInput(true);
            connection.setRequestMethod("GET");
            //获取网络返回的状态码
            int responseCode = connection.getResponseCode();
            if (responseCode == 200) {
                inputStream = connection.getInputStream();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }
}

上面就是下载和解析XML文件的所有代码,我已经全部贴出,最后就是在Activity中调用了,好像从Android4.0开始就不能直接在主线程中下载文了,因此我继承了AsyncTask这个类。在这里就把代码全部贴出了吧!

package com.study.xiaohui.myapplication;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.study.xiaohui.myapplication.downloader.DownLoader;
import com.study.xiaohui.myapplication.parse.PullXMLInfo;
import com.study.xiaohui.myapplication.parse.PullXMLTools;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    //本机XML文件的位置
    private String PATH = "http://192.168.1.101:82/mp3/example.xml";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //调用LongTasks
        LongTasks longTasks = new LongTasks();
        longTasks.execute();
    }
    //主线程中不能直接同网络下载内容,因此重新定义了一个继承AsyncTask的类
    class LongTasks extends AsyncTask<String, Void, List> {
        String str = PATH;
        @Override
        protected List doInBackground(String... params) {
            //定义一个List
            List<PullXMLInfo> list = null;
            DownLoader downLoader = new DownLoader();
            PullXMLTools pullXMLTools = new PullXMLTools();
            InputStream inputStream = downLoader.downloader(str);
            try {
                list = pullXMLTools.parseXML(inputStream, "utf-8");
                //读取List中的内容通过Log显示出来
                for (PullXMLInfo pullXMLInfo : list) {
                    Log.i("fnhFire", "" + pullXMLInfo.toString());
                }
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(List list) {
            super.onPostExecute(list);
        }
    }
}

到这里使用Pull解析XML文件的步骤就全部完成了。上面的代码全部是本人亲测通过的,希望能对大家的学习和工作有所帮助。下面是解析出来的内容,我们与XML文件的内容对照发现完全一致。

20160302182254799.png



相关文章
|
11月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
1059 94
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
466 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
1154 19
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
544 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
3154 2
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
670 15
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10964 2
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
966 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1607 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
653 4

热门文章

最新文章

推荐镜像

更多