解析XML文檔的三種方式:dom解析,sax解析,pull解析。
dom解析
概述:全稱document object model(文檔對象模型) 文檔:指的是標記型文檔(html、xml);對象:在對象裏面有屬性和方法;使用dom裏面提供的對象裏面的屬性和方法,對標記型文檔進行操作。dom解析常用於JavaWeb中的xml文檔解析。
dom解析優缺點:
- 優點:根據xml文檔的結構,在內存中分配了一個樹形結構,因爲是樹形結構,很方便增加,修改,刪除的操作。
- 缺點:如果解析的文檔過大,一次性在內存中分配一個樹形結構,容易造成內存溢出。
sax解析
概述:全稱Simple API for XML,既是一種接口,也是一種軟件包。它是一種XML解析的替代方法。SAX不同於DOM解析,它逐行掃描文檔,一邊掃描一邊解析,當讀到特定的標籤時候,自動調用相應的方法進行操作。由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中,這對於大型文檔的解析是個巨大優勢。sax解析用於android中的xml文檔解析。
sax解析優缺點:
- 優點:由於解析方式是邊讀邊解析,不會造成內存的溢出。
- 缺點:不能實現增加,修改,刪除的操作。
pull解析
概述:pull解析和sax解析的原理一樣,pull解析xml文件把xml中的內容放到集合裏面。不一樣的是pullpull讀取xml文件後調用方法返回的是數字:
讀取到xml的聲明返回數字0 START_DOCUMENT;
讀取到xml的結束返回數字1 END_DOCUMENT
讀取到xml的開始標籤返回數字2 START_TAG
讀取到xml的結束標籤返回數字3 END_TAG
讀取到xml的文本返回數字4 TEXT
pull解析常用於Android中的xml文件解析。也可脫離Android獨自使用,由於我是搞Android開發的,這個就寫的詳細一點了。
代碼:
person.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<student id="1">
<name>張三</name>
<sex>男</sex>
<age>18</age>
</student>
<student id="2">
<name>李四</name>
<sex>女</sex>
<age>20</age>
</student>
</root>
PullPerson.java
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
public class PullPerson {
/**
* @author Listener_Gao
* @param args
*/
public static void main(String[] args) {
//person.xml文檔在項目的src目錄下
String path = "src/person.xml";
List<Person> list = null;
try {
list = pullParserXml(path);
} catch (Exception e) {
e.printStackTrace();
}
//遍歷集合
for (Person p : list) {
System.out.println(p);
}
}
/**
* pull解析person.xml文件,把解析到的文件放到集合中
* @return List<Person> 返回list集合
* @param filePath xml文件的路徑
*/
public static List<Person> pullParserXml(String filePath) throws Exception {
//創建解析器工廠 對象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//使用解析器工廠對象 創建解析器
XmlPullParser parser = factory.newPullParser();
//把要操作的文件放到解析器中
parser.setInput(new FileInputStream(filePath), "utf-8");
/***************************開始解析xml文檔************************/
List<Person> list = null;
Person p = null;
//獲取標籤的類型
int typeEvent = 0; //parser.getEventType();
//如果沒有讀到結束的標籤就一直循環
while((typeEvent = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
//得到當前解析到的標籤的名稱
String tagName = parser.getName();
/**
* 1,解析到root,創建list集合
* 2,解析到student,創建Person對象
* 3,解析到name,sex,age內容是,過去標籤的內容
* 4,將標籤的內容添加到person對象中
*/
switch(typeEvent) {
case XmlPullParser.START_TAG:
if("root".equals(tagName)) {
//解析到root,創建list集合
list = new ArrayList<>();
}else if("student".equals(tagName)) {
//解析到student,創建Person對象
p = new Person();
//讀取student標籤中的id屬性
int id = Integer.parseInt(parser.getAttributeValue(0));
//將id的值放到person對象中
p.setId(id);
//簡寫成一步
//p.setId(Integer.parseInt(parser.getAttributeValue(0)));
}else if ("name".equals(tagName)) {
//得到標籤的值
String name = parser.nextText();
//將得到的name的值放person對象中
p.setName(name);
}else if ("sex".equals(tagName)) {
p.setSex(parser.nextText());
}else if ("age".equals(tagName)) {
p.setAge(Integer.parseInt(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
//當解析到結束標籤的root時,將對象添加到list集合中
if("student".equals(tagName)) {
list.add(p);
//p = null;
}
break;
}
//繼續執行
parser.next();
}
return list;
}
}