XML解析三种方式
DOM
通用性强,它会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据;
简单直观,但需要将文档读取到内存,并不太适合移动设备;
SAX
SAX是一个解析速度快并且占用内存少的xml解析器;
采用事件驱动,它并不需要解析整个文档;
实现:继承DefaultHandler,覆写startElement、endElement、characters等方法;
PULL
Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型;推荐使用。
PULL解析XML核心代码
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setInput(fileInputStream, “utf-8”);//设置数据源编码
- int eventCode = parser.getEventType();//获取事件类型
- while(eventCode != XmlPullParser.END_DOCUMENT) {
- switch (eventCode){
- case XmlPullParser.START_DOCUMENT: //开始读取XML文档
- //实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- if("person".equals(parser.getName())) {
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- }
- break;
- case XmlPullParser.END_TAG://读完一个Person,可以将其添加到集合类中
- break;
- }
- parser.next();
- }
PULL解析XML示例方法
Java方法
- public static List<Person> readXML(InputStream inStream) {
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(inStream, "UTF-8");// 设置数据源编码
- int eventType = parser.getEventType();// 获取事件类型
- Person currentPerson = null;
- List<Person> persons = null;
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
- persons = new ArrayList<Person>();// 实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- String name = parser.getName();
- if (name.equalsIgnoreCase("person")) {
- currentPerson = new Person();
- currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
- } else if (currentPerson != null) {
- if (name.equalsIgnoreCase("name")) {
- currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
- } else if (name.equalsIgnoreCase("age")) {
- currentPerson.setAge(new Short(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG:// 结束元素事件
- //读完一个Person,可以将其添加到集合类中
- if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
- persons.add(currentPerson);
- currentPerson = null;
- }
- break;
- }
- eventType = parser.next();
- }
- inStream.close();
- return persons;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
应用
XML文件
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>孙洋洋</name>
- <age>30</age>
- </person>
- <person id="20">
- <name>孙彬彬</name>
- <age>25</age>
- </person>
- </persons>
- package com.app.data;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStreamWriter;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlPullParserException;
- import org.xmlpull.v1.XmlPullParserFactory;
- import com.app.other.Person;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Xml;
- import android.widget.TextView;
- public class XMLActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_xml);
- StringBuilder sBuilder = new StringBuilder();
- File xmlFile = new File("/mnt/sdcard/App/person.xml");
- try {
- FileInputStream inputStream = new FileInputStream(xmlFile);
- // URL url = new URL("http://10.0.2.2:8888/android/person.xml");
- // HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
- // InputStream inputStream = urlConnection.getInputStream();
- List<Person> list = readXML(inputStream);
- for (int i = 0; i < list.size(); i++) {
- Person person = list.get(i);
- sBuilder.append("第-" + i + "-条记录:\n");
- sBuilder.append("getName--" + person.getName() + "\n");
- sBuilder.append("getAge--" + person.getAge() + "\n");
- sBuilder.append("getId--" + person.getId() + "\n");
- }
- inputStream.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- TextView textView = (TextView)findViewById(R.id.textView2);
- textView.setText(sBuilder);
- }
- public static List<Person> readXML(InputStream inStream) {
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(inStream, "UTF-8");// 设置数据源编码
- int eventType = parser.getEventType();// 获取事件类型
- Person currentPerson = null;
- List<Person> persons = null;
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理
- persons = new ArrayList<Person>();// 实例化集合类
- break;
- case XmlPullParser.START_TAG://开始读取某个标签
- //通过getName判断读到哪个标签,然后通过nextText()获取文本节点值,或通过getAttributeValue(i)获取属性节点值
- String name = parser.getName();
- if (name.equalsIgnoreCase("person")) {
- currentPerson = new Person();
- currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
- } else if (currentPerson != null) {
- if (name.equalsIgnoreCase("name")) {
- currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
- } else if (name.equalsIgnoreCase("age")) {
- currentPerson.setAge(new Short(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG:// 结束元素事件
- //读完一个Person,可以将其添加到集合类中
- if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {
- persons.add(currentPerson);
- currentPerson = null;
- }
- break;
- }
- eventType = parser.next();
- }
- inStream.close();
- return persons;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
XML布局文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:padding="15dp" >
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="XML文件读取"
- android:layout_gravity="center_horizontal" />
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="TextView" />
- </LinearLayout>
XML文件位置
执行结果:
相关推荐
在这个“XmlPullParser解析Xml文件解析demo”中,我们将探讨如何利用XmlPullParser来解析XML文件,以及其在实际开发中的应用。 XML(eXtensible Markup Language)是一种用于标记数据的标记语言,广泛用于数据交换...
XMLPullParser是Android开发中用于解析XML文档的一种高效且节省内存的方法。它提供了一种事件驱动的解析模型,允许开发者逐个处理XML文档的元素,而不是一次性加载整个文档到内存中,这对于处理大体积的XML数据尤其...
本篇文章将详细探讨如何在Android中使用XmlPullParser来解析XML文件,并通过一个具体的WeiboTest示例进行说明。 首先,理解XmlPullParser的工作原理至关重要。它是一个基于事件驱动的解析器,通过一系列的回调方法...
5. 使用XmlPullParser解析XML文件 6. 指定解析的文件和编码格式 7. 使用while循环解析XML文件 8. 获得事件类型,例如开始元素、结束元素、文本元素等 在Android开发中,XML文件解析和使用XML保存一些信息变得非常...
本文将深入探讨如何使用SAX、DOM和Pull解析器解析XML文件,以及如何生成XML文件。我们将同时展示Java和Kotlin两种语言的实现方法。 一、SAX解析XML文件 SAX(Simple API for XML)是一种事件驱动的解析器,它不会一...
在本文中,我们介绍了 Android 解析 XML 文件升级 APK 的方法,其中包括使用 XmlPullParser 解析 XML 文件和使用 DownloadManager 升级 APK 等。这些方法可以帮助我们轻松地解析 XML 文件和升级 APK,从而提高 ...
第一个按钮创建XML文件,后两个按钮分别使用DOM和XmlPullParser解析XML文件,并将结果展示在TextView中。这种做法有助于开发者直观地理解这两种解析方法的使用。 总结来说,Android开发中XML的创建和解析是重要的...
本篇将深入探讨Android中解析XML文件的方法,以及如何通过示例代码`ReadXmlConfigFile`来实现这一过程。 ### XML解析器类型 Android提供了多种解析XML的方式,主要包括以下几种: 1. **DOM解析器**:Document ...
本文将详细介绍Android编程解析XML文件的方法,结合实例形式分析了Android基于XmlPullParser解析xml文件的相关操作技巧与注意事项。 XmlPullParser是Android系统中提供的一种解析XML文件的方法,它基于事件驱动的...
总的来说,Volley联网解析XML文件的关键在于创建自定义的`Request`子类,正确地解析XML数据,并在响应回调中处理解析结果。通过这种方式,我们可以利用Volley的强大功能和XML的灵活性,实现高效、可靠的网络数据交换...
Pull解析器是一种轻量级的解析方式,它允许程序在解析XML时按需获取数据,而不需要一次性加载整个文档到内存,从而提高了效率和资源利用率。 首先,我们来了解XML的基本结构。XML文件由一系列元素构成,每个元素由...
本教程将重点讲解如何在Android中创建XML文件以及使用DOM和XmlPullParser解析XML文件。以下是对这两个主题的详细说明。 首先,我们来看如何使用`XmlSerializer`创建XML文件。`XmlSerializer`是Android SDK中的一个...
使用XMLPullParser解析XML的基本步骤如下: 1. 创建XmlPullParserFactory对象。 2. 使用factory创建XmlPullParser对象。 3. 设置输入源,可以是文件、流或字符数组。 4. 遍历XML事件,处理开始标签(START_TAG)、...
本教程将深入讲解如何在Android中解析XML文件,帮助开发者更好地理解和运用这一核心技术。 首先,Android提供了两种主要的XML解析方式:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。DOM解析...
本篇文章将重点讨论如何在Android中使用Pull解析器(PullParser)来解析XML文件。Pull解析器是一种事件驱动的解析方式,它允许应用程序在解析过程中按需获取XML数据,而不是一次性加载整个文档到内存,这使得处理...
本文将深入探讨如何在Android中使用Pull解析器解析XML文件。 一、XML Pull解析器简介 XML Pull解析器(XML Pull API)是一种基于事件驱动的解析模型,它不需预先加载整个XML文档,而是逐行读取,当遇到特定的XML...
在Android开发中,解析XML有多种方式,包括DOM(Document Object Model)、SAX(Simple API for XML)以及PULL(PULL Parser)。本篇文章将详细探讨PULL解析器,它是Android平台特有的一种轻量级、事件驱动的XML解析...
接下来,我们将详细介绍Pull解析XML文件的过程。 1. **引入Pull解析器库** 在Android项目中,首先需要添加对`androidx.xml`库的依赖,确保解析器可用。在`build.gradle`文件中添加以下依赖: ```gradle ...
SAX解析适合大型XML文件和复杂结构,而PULL解析则适用于小型XML文件和简单结构。在提供的`SAXParseDemo`项目中,你可以找到具体的SAX解析实现,通过阅读和理解代码,可以更好地掌握这两种解析方法的使用。 总之,...
【Android中的XmlPullParser解析XML】 在Android开发中,处理XML数据时,`XmlPullParser`是一种高效且节省内存的解析方式。它是基于事件驱动的解析器,可以逐行读取XML文档,通过监听各种事件(如开始文档、开始...