对于“Android 创建与解析XML(四)——详解Pull方式”这个话题,我会进行以下几方面的讲解:
- Pull方式解析XML文件的特点和基本原理
- Pull解析XML的主要API以及使用方式
- Pull方式解析XML的示例详解
1. Pull方式解析XML文件的特点和基本原理
在Android中,解析XML文件主要有三种方式:DOM方式、SAX方式和Pull方式。Pull方式作为最简单、最快速的一种方式,它的主要特点有:
- 处理速度快,在处理大型XML文件时更具优势
- 不会将整个XML文件载入到内存中,对内存的占用量比较少
- 缺点是需要我们手动编写处理代码,实现自己需要的功能
Pull方式解析XML的基本原理是通过流的形式从XML文件中读取数据,逐个解析XML标签。同时,通过对特定函数的调用,我们可以获取标签中的各个属性和值。
2. Pull解析XML的主要API以及使用方式
Pull解析XML文件需要用到的几个主要API介绍如下:
XmlPullParserFactory
:Pull解析XML前需要先初始化一个XmlPullParserFactory
对象,用于创建一个解析器对象XmlPullParser
:解析器对象,使用Pull解析XML文件时需要通过此对象的相关属性和方法获取XML数据START_DOCUMENT
、START_TAG
、TEXT
、END_TAG
、END_DOCUMENT
:解析XML文件时的标签类型
在使用Pull解析XML文件时,我们需要按以下的步骤进行操作:
- 在程序中创建一个
XmlPullParserFactory
工厂对象。 - 通过
XmlPullParserFactory
对象的newPullParser()
方法,创建一个解析器对象XmlPullParser
。 - 实现解析器对象的
setInput()
方法,将需要解析的XML数据以流的形式传入。 - 通过对解析器对象的相关方法调用,逐个解析XML文件,获取标签的属性值。
3. Pull方式解析XML的示例详解
下面通过一个实例来详细讲解如何使用Pull方式解析XML。
假设我们需要从以下XML文件中获取每一本书籍的ISBN值、图书名称、作者和出版日期等信息。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<isbn>978-7-121-24662-4</isbn>
<name>Java核心技术(卷一)</name>
<author>Cay S. Horstmann</author>
<published-date>2017-03-01</published-date>
</book>
<book id="2">
<isbn>978-7-121-24710-2</isbn>
<name>Java核心技术(卷二)</name>
<author>Cay S. Horstmann</author>
<published-date>2017-06-01</published-date>
</book>
</books>
首先,我们需要在项目中包含以下依赖:
implementation 'org.xmlpull:xpp3:1.1.4c'
接下来实现一个XmlPullParser解析工具类,包含如下代码:
public class XmlPullParserUtil {
private static final String TAG = "XmlPullParserUtil";
/**
* 解析XML文件,返回指定的book数据对象集合
*
* @param inputStream XML文件流数据
* @return book数据对象集合
*/
public static List<Book> parseXML(InputStream inputStream) {
List<Book> books = new ArrayList<>();
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(inputStream, "UTF-8");
int eventType = parser.getEventType(); // 初始解析状态(开始解析)
Book book = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("book".equals(tagName)) { // 一个新的book标签开始
book = new Book();
book.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
} else if ("isbn".equals(tagName)) { // 解析isbn数据
if (book != null) {
book.setIsbn(parser.nextText());
}
} else if ("name".equals(tagName)) { // 解析name数据
if (book != null) {
book.setName(parser.nextText());
}
} else if ("author".equals(tagName)) { // 解析author数据
if (book != null) {
book.setAuthor(parser.nextText());
}
} else if ("published-date".equals(tagName)) { // 解析published-date数据
if (book != null) {
book.setPublishedDate(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
if ("book".equals(tagName)) { // 一个book标签解析完成
books.add(book);
book = null;
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (Exception e) {
Log.e(TAG, "parseXML error: " + Log.getStackTraceString(e));
} finally {
try {
inputStream.close();
} catch (IOException e) {
Log.e(TAG, "close inputStream error: " + Log.getStackTraceString(e));
}
}
return books;
}
}
然后我们可以在Activity中实现如下示例:
public class MainActivity extends AppCompatActivity {
private TextView mTvContent;
private List<Book> mBooks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
// 读取books.xml文件,获取其中数据
mBooks = XmlPullParserUtil.parseXML(getResources().openRawResource(R.raw.books));
String content = "";
for (Book book : mBooks) {
content += "id: " + book.getId()
+ ", name: " + book.getName()
+ ", author: " + book.getAuthor()
+ ", date: " + book.getPublishedDate()
+ "\n";
}
mTvContent.setText(content);
}
private void initView() {
mTvContent = findViewById(R.id.tv_content);
}
}
通过加载含有XML数据的文件流,再用XmlPullParser工具类解析此流数据,并最终将解析出的结果展示在UI上。
以上就是Pull方式解析XML文件的详细攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 创建与解析XML(四)——详解Pull方式 - Python技术站