详解Android之解析XML文件三种方式(DOM,PULL,SAX)
一、引言
在Android开发中,解析XML文件是非常常见的操作,而解析XML文件有多种方式可以选择。本文将详细介绍Android中解析XML文件的三种方式:DOM,PULL和SAX,包括他们的实现原理、使用方法、比较优缺点等。
二、DOM方式解析XML文件
DOM方式解析XML文件是将整个XML文件读入到内存中,然后解析为一个树形结构,最后以DOM树的方式存储在内存中。
1. DOM方式解析XML实现原理
DOM方式将整个XML文件读入到内存中,并解析为一个具有层级结构的文档对象模型(DOM)树,这个树形结构中,每一个节点表示XML文档中的一个元素或属性。
DOM方式的解析流程如下:
1、解析器读取XML文件,并将其转化为一个Document对象。
2、解析器将Document对象中的节点解析为DOM树,每一层节点以及节点的属性都被转化为相应的DOM对象,比如Element对象和Attribute对象等。
3、将DOM树保存在内存中。
2. DOM方式解析XML的优缺点
优点:
1、实现简单易懂。
2、解析完整性好,可以对XML文件进行增、删、改、查等操作。
缺点:
1、较为消耗内存。
2、由于需要将整个XML文件读入内存并解析为DOM树,所以解析大XML文件效率较低。
3. DOM方式解析XML的实现方法
DOM方式解析XML文件需要用到XmlPullParser解析器,具体步骤如下:
1、获取XmlPullParser解析器。
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
2、调用XmlPullParser解析器的setInput方法,设置待解析的XML文件输入流。
parser.setInput(inputStream, "utf-8");
3、调用XmlPullParser解析器的next方法,开始解析XML文件。
int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "start document");
break;
case XmlPullParser.START_TAG:
Log.d(TAG, "start tag: " + parser.getName());
break;
case XmlPullParser.END_TAG:
Log.d(TAG, "end tag: " + parser.getName());
break;
case XmlPullParser.TEXT:
Log.d(TAG, "text: " + parser.getText());
break;
default:
break;
}
eventType = parser.next();
}
Log.d(TAG, "end document");
4. DOM方式解析XML工程示例
示例:解析books.xml文件
books.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<title>Java开发</title>
<author>张三</author>
<price>45.00</price>
</book>
<book>
<title>Android开发</title>
<author>李四</author>
<price>42.00</price>
</book>
</books>
解析过程如下:
1、获取XmlPullParser解析器。
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
2、创建FileInputStream对象,并将books.xml文件读取为输入流。
FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));
3、设置XmlPullParser解析器的输入流,并设置编码格式。
parser.setInput(inputStream, "utf-8");
4、读取并解析XML文件。
int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "start document");
break;
case XmlPullParser.START_TAG:
Log.d(TAG, "start tag: " + parser.getName());
break;
case XmlPullParser.END_TAG:
Log.d(TAG, "end tag: " + parser.getName());
break;
case XmlPullParser.TEXT:
Log.d(TAG, "text: " + parser.getText());
break;
default:
break;
}
eventType = parser.next();
}
Log.d(TAG, "end document");
输出结果如下:
start document
start tag: books
start tag: book
start tag: title
text: Java开发
end tag: title
start tag: author
text: 张三
end tag: author
start tag: price
text: 45.00
end tag: price
end tag: book
start tag: book
start tag: title
text: Android开发
end tag: title
start tag: author
text: 李四
end tag: author
start tag: price
text: 42.00
end tag: price
end tag: book
end tag: books
end document
三、PULL方式解析XML文件
PULL方式解析XML文件以流的方式对XML文件进行解析,在行进解析的过程中,PULL方式只会获取当前需要处理的节点信息,而不会将整个XML文件读取到内存中。
1. PULL方式解析XML实现原理
PULL方式是以基于事件的方式解析XML文件,使用XmlPullParser解析器,每次解析节点时只获取当前节点的信息,而不会将整个XML文件读取到内存中,从而节约了内存空间。
2. PULL方式解析XML的优缺点
优点:
1、较为消耗内存。
2、解析效率高,适合解析大XML文件。
缺点:
1、需要重复调用next方法获取每个节点的信息,不如DOM方式方便。
3. PULL方式解析XML的实现方法
1、获取XmlPullParser解析器。
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
2、调用XmlPullParser解析器的setInput方法,设置待解析的XML文件输入流。
parser.setInput(inputStream, "utf-8");
3、使用while循环,读取并解析XML文件。
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "start document");
break;
case XmlPullParser.START_TAG:
Log.d(TAG, "start tag: " + parser.getName());
break;
case XmlPullParser.END_TAG:
Log.d(TAG, "end tag: " + parser.getName());
break;
case XmlPullParser.TEXT:
Log.d(TAG, "text: " + parser.getText());
break;
default:
break;
}
eventType = parser.next();
}
Log.d(TAG, "end document");
4. PULL方式解析XML工程示例
示例:解析books.xml文件
books.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<title>Java开发</title>
<author>张三</author>
<price>45.00</price>
</book>
<book>
<title>Android开发</title>
<author>李四</author>
<price>42.00</price>
</book>
</books>
解析过程如下:
1、获取XmlPullParser解析器。
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
2、创建FileInputStream对象,并将books.xml文件读取为输入流。
FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));
3、设置XmlPullParser解析器的输入流,并设置编码格式。
parser.setInput(inputStream, "utf-8");
4、读取并解析XML文件。
int eventType = parser.next();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "start document");
break;
case XmlPullParser.START_TAG:
Log.d(TAG, "start tag: " + parser.getName());
break;
case XmlPullParser.END_TAG:
Log.d(TAG, "end tag: " + parser.getName());
break;
case XmlPullParser.TEXT:
Log.d(TAG, "text: " + parser.getText());
break;
default:
break;
}
eventType = parser.next();
}
Log.d(TAG, "end document");
输出结果如下:
start document
start tag: books
start tag: book
start tag: title
text: Java开发
end tag: title
start tag: author
text: 张三
end tag: author
start tag: price
text: 45.00
end tag: price
end tag: book
start tag: book
start tag: title
text: Android开发
end tag: title
start tag: author
text: 李四
end tag: author
start tag: price
text: 42.00
end tag: price
end tag: book
end tag: books
end document
四、SAX方式解析XML文件
SAX方式解析XML文件是一种基于事件驱动的解析方式,它并不完整地读取XML文档,而是实时流式地“拉”取到每个节点,并触发相应的事件处理器。
1. SAX方式解析XML实现原理
SAX方式解析XML文件是从上到下逐行解析XML文件,当遇到一个节点时,就触发相应的事件处理器,然后继续向下解析,直到解析完整个XML文件。
2. SAX方式解析XML的优缺点
优点:
1、效率高,适合解析大XML文件。
2、比DOM方式占用的内存更小。
缺点:
1、无法对XML文件进行增、删、改操作,只能对XML文件进行读取。
3. SAX方式解析XML的实现方法
1、获取SAXParser解析器。
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
2、设置相应的事件处理器。
DefaultHandler handler = new DefaultHandler() {
@Override
public void startDocument() throws SAXException {
super.startDocument();
Log.d(TAG, "start document");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.d(TAG, "end document");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
Log.d(TAG, "start element: " + qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
Log.d(TAG, "end element: " + qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
Log.d(TAG, "text: " + new String(ch, start, length));
}
};
3、使用SAXParser解析器解析XML文件并设置事件处理器。
saxParser.parse(inputStream, handler);
4. SAX方式解析XML工程示例
示例:解析books.xml文件
books.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<title>Java开发</title>
<author>张三</author>
<price>45.00</price>
</book>
<book>
<title>Android开发</title>
<author>李四</author>
<price>42.00</price>
</book>
</books>
创建新的DefaultHandler对象示例如下:
DefaultHandler handler = new DefaultHandler() {
@Override
public void startDocument() throws SAXException {
super.startDocument();
Log.d(TAG, "start document");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.d(TAG, "end document");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
Log.d(TAG, "start element: " + qName);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
Log.d(TAG, "end element: " + qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
Log.d(TAG, "text: " + new String(ch, start, length));
}
};
解析过程如下:
1、获取SAXParser解析器。
SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
2、创建FileInputStream对象,并将books.xml文件读取为输入流。
FileInputStream inputStream = new FileInputStream(new File(getFilesDir().getPath() + "/books.xml"));
3、使用SAXParser解析器解析XML文件并设置事件处理器。
saxParser.parse(inputStream, handler);
输出结果如下:
start document
start element: books
start element: book
start element: title
text: Java开发
end element: title
start element: author
text: 张三
end element: author
start element: price
text: 45.00
end element: price
end element: book
start element: book
start element: title
text: Android开发
end element: title
start element: author
text: 李四
end element: author
start element: price
text: 42.00
end element: price
end element: book
end element: books
end document
五、总结
DOM方式、PULL方式和SAX方式是Android解析XML文件的三种方式,每种方式都有其特点和适用场景。在实际开发中需要根据实际情况选择合适的方式来解析XML文件。
参考链接
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Android之解析XML文件三种方式(DOM,PULL,SAX) - Python技术站