SAX解析XML:html
SAX基本原理:java
採用事件驅動解析XML文件,以流式方式逐行的去讀,它不須要解析完整個文檔,在按內容順序解析文檔的過各中,SAX會判斷當前講到的字符是否合法XML語法中的某部分,若是符合就觸發事件(例如startDocument()、endDocument()諸如此類的事件),它的特色是不會記錄前面所碰到的標籤,而且它是一個解析速度快而且佔用內存少的XML解析器,web
SAX解析步驟:數組
一、從SAXPraserFactory中建立一個新的實例app
二、再從SAXParserFactory裏獲得一個新的SAX解析器對象SAXParseride
三、再調用SAXParser對象的.parse()方法裏面帶兩個參數一個是輸入流一個是DefaultHandler對象這樣就能夠了。而DefaultHandler是實現了ContentHandler接口的。ContentHandler接口中定義了一系列的方法事件:諸如:oop
[java] view plaincopyprint?測試
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_1 height=14 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">ui
public abstract void startDocument () this
方法做用:文檔解析觸發此事件
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_2 height=14 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public abstract void endDocument ()
方法做用:文檔解析結束時觸發此事件
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_3 height=14 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public abstract void startElement (String uri, String localName, String qName, Attributes atts)
方法做用:當開始讀取元素時觸發此事件
參數說明:
uri:命名空間
localName:不帶命名空間的前綴的標籤名
qName:不按期命名空間前綴的標籤名
atts:獲得全部的屬性各和相應的值
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_4 height=14 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public abstract void endElement (String uri, String localName, String qName)
方法做用:讀取的標籤結束時觸發此事件,參數說明同上
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_5 height=14 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public abstract void characters (char[] ch, int start, int length)
方法做用:用來處理在XML文件中讀到的內容
參數說明:
ch:用於存放文件的內容
start:所讀到的字符串在這個數組中的起始位置
length:長度
咱們能夠用new String(ch,start,length)來獲取內容
下面以person.xml文件爲例採用SAX解析器來模擬解析這個XML文檔:
[html] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_6 height=14 name=ZeroClipboardMovie_6 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=6&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
<?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>
解析person.xml觸發的事件爲:
讀到的標籤及內容 |
觸發事件 |
{文檔開始} |
startDocument() |
<persons> |
startElement(, "persons", null, "{Attributes}") |
"\n\t" |
characters("<persons>...</persons>", "12", "2") |
<person> |
startElement(, "person", null, "{Attributes}") |
"\n\t\t" |
characters("<persons>...</persons>", "31", "3") |
<name> |
startElement(, "name", null, "{Attributes}") |
"李明" |
characters("<persons>...</persons>", "40", "2") |
</name> |
endElement("", "name", null) |
"\n\t\t" |
characters("<persons>...</persons>", "50", "3") |
<age> |
startElement(, "age", null, "{Attributes}") |
"30" |
characters("<persons>...</persons>", "58", "2") |
</age> |
endElement("", "age", null) |
"\n\t" |
characters("<persons>...</persons>", "67", "2") |
</person> |
endElement("", "person", null) |
"\n\t" |
characters("<persons>...</persons>", "79", "2") |
又重複<person> |
…. |
{文檔結束} |
endDocument() |
實例1:讀取XML文件裏的內容把這些內容構形成一個Person對象,而後讀取這個XML文檔裏內容將其Person對象添加到一個List集合裏:
Person類:
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_7 height=14 name=ZeroClipboardMovie_7 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=7&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public class Person {
private Integer id;
private String name;
private short age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public short getAge() {
return age;
}
public void setAge(short age) {
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}
業務bean:
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_8 height=14 name=ZeroClipboardMovie_8 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=8&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public class SAXPersonService {
public static List<Person> readXml(InputStream inputStream)
throws Exception {
// 獲得一個SAXParserFactory對象
SAXParserFactory spf = SAXParserFactory.newInstance();
// SAX解析對象
SAXParser saxParser = spf.newSAXParser();
// ContentHandler對象
XMLContentHandler handler = new XMLContentHandler();
// 開始解析
saxParser.parse(inputStream, handler);
// 關閉流
inputStream.close();
return handler.getPersons();
}
}
XMLContentHandler繼承自DefalutHander而DefaultHandler實現ContentHandler接口
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_9 height=14 name=ZeroClipboardMovie_9 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=9&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
/**
* 繼承於DefaultHandler 這個類也是實現ContentHandler
* @author Administrator
*
*/
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String preTag;//當前標記
public List<Person> getPersons() {
return persons;
}
/**
* 文檔開始
*/
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
/**
* 讀取的文檔內容
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
if (person != null) {
String data = new String(ch, start, length);
// 判斷前面的元素是不是"name"
if ("name".equals(preTag)) {
person.setName(data);
} else if ("age".equals(preTag)) {
person.setAge(new Short(data));
}
}
}
/**
* 元素開始
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 判斷目前解析到的元素是否等於"person"
if ("person".equals(localName)) {
person = new Person();
// person.setId(Integer.parseInt(attributes.getValue(0)));
person.setId(Integer.parseInt(attributes.getValue("", "id")));
}
// 當前元素
preTag = localName;
}
/**
* 解析完一個元素後就把這個元素加到List裏
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("person".equals(localName) && person != null) {
persons.add(person);
person = null;
}
//再將這個當前元素設爲null
preTag=null;
}
}
測試:
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_10 height=14 name=ZeroClipboardMovie_10 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=10&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
public class SAXPersonServiceTest extends AndroidTestCase {
private static final String TAG = "LogTest";
public void testSAXReadXml() throws Exception {
//從資源文件中獲取輸入流
InputStream inputStream = SAXPersonServiceTest.class.getClassLoader()
.getResourceAsStream("itcast.xml");
List<Person> list = SAXPersonService.readXml(inputStream);
for (Person person : list) {
System.out.println(person);
}
}
}
如需轉載引用請註明出處:<a href="http://blog.csdn.net/jiahui524">http://blog.csdn.net/jiahui524</a>
[java] view plaincopyprint?
<EMBED style="-webkit-animation: playerInserted 0.001s" id=ZeroClipboardMovie_11 height=14 name=ZeroClipboardMovie_11 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=11&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">