解析思想
解析: 讀取xml.將xml中記錄 的數據提取.
DOM Document Object Model 文檔對象模型
DOM思想是由W3C組織(world wide web)發佈的.
核心思想: 把文檔中所有內容都 封裝成對象.
對象種類:
Document 整個(HTML,XML)文檔
Element 文檔中每一個標籤都會被封裝成Element對象
Attribute 標籤上的每一個屬性都會被封裝成Attribute
Text 文檔中,標籤內的文本都會封裝成Text對象
Common 註釋,文檔中的註釋 ,會被封裝成common.
Dom的優勢:
將文檔結構(所有內容)都以對象的形式保留在了內存中.我們可以對內存中的(Dom樹)進行增刪改查操作,並且操作很方便.
Dom的劣勢:
因爲保留了全部文檔內容,資源消耗比較大.
SAX解析思想
出身: 出身於國外論壇.
解析原理: 事件驅動.
優點: 在讀取xml文檔時, 已經根據定義好的事件,對xml內容進行了篩選.解析完成後,
內存中只保留了我們想要的內容.比較節約資源. 在資源比較匱乏的平臺使用.
缺點: 沒有保留文檔的結構. 無法進行增刪改的操作.
sax中的事件:
文檔開始事件: startDocument
文檔結束事件: endDocument
元素開始事件: startElement
元素結束事件: endElement
文本事件:character
Pull解析
與Sax一樣.都屬於事件驅動的解析方式.
相比Sax解析過程更加靈活.
sax一旦開始解析就是從頭讀到尾.不解析完整個文檔不會停
pull解析較爲靈活.是以事件爲單位.手動向下繼續. 如果獲得到我們要找的內容. 可以停止繼續解析.
要解析的stu.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="panpan_0001" >
<name>tom</name>
<sex>male</sex>
<age>18</age>
</student>
<student number="panpan_0002" >
<name>jerry</name>
<sex>male</sex>
<age>16</age>
</student>
</students>
解析的代碼:
實體類部分
package cn.wonders.bean;
public class Student {
private String number;
private String name;
private String sex;
private int age;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "Student[number="+number+",name="+name+",sex="+sex
+",age="+age+"]";
}
}
解析部分:
public class PullTool {
//使用Pull解析
public static List<Student>parseXml(InputStream is)throws Exception{
List<Student>list = null;
Student stu =null;
//1.創建解析器工廠
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//2.使用工廠獲得解析器
XmlPullParser parser = factory.newPullParser();
//3.使用解析器讀取xml流
parser.setInput(is, "UTF-8");
//4.獲得當前事件的狀態
int type =parser.getEventType();
// 返回類型START_DOCUMENT,END_DOCUMENT,START_TAG,END_TAG,TEXT
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//判斷當前遇到的元素名稱是否爲students
if ("students".equals(parser.getName())) {
list = new ArrayList<Student>();
}else if ("student".equals(parser.getName())) {
//初始化Student對象
stu = new Student();
//讀取number屬性
String number = parser.getAttributeValue(null, "number");
stu.setNumber(number);
}else if ("name".equals(parser.getName())) {
String name = parser.nextText();
stu.setName(name);
}else if("sex".equals(parser.getName())){
String sex = parser.nextText();
stu.setSex(sex);
}else if("age".equals(parser.getName())){
int age = Integer.parseInt(parser.nextText());
stu.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if ("student".equals(parser.getName())) {
list.add(stu);
stu = null;
}
break;
default:
break;
}
type = parser.next();
}
return list;
}
public static void main(String[]args)throws Exception{
FileInputStream is = new FileInputStream("src/stu.xml");
List<Student>list = PullTool.parseXml(is);
System.out.println(list);
is.close();
}
}
pull解析的jar包下載:
http://download.csdn.net/detail/panpan_1994/9607155
解析的結果爲:
[Student[number=panpan_0001,name=tom,sex=male,age=18], Student[number=panpan_0002,name=jerry,sex=male,age=16]]