android系統(tǒng)支持使用SAX、DOM或者pull讀取xml文件(建議不要使用DOM解析-它比較耗內(nèi)存)
SAX是一個解析速度快并且占用內(nèi)存少的xml解析器。它解析的時候采用事件驅(qū)動。 即它不需要解析完整個文檔,在按內(nèi)容順序解析文檔的過程中,SAX會判斷當(dāng)前讀到的字符是否合法的XML語法的某部分, 如果符合,則會調(diào)用某個回調(diào)方法——這些方法定義在ContentHandle接口中。
startDocument() 當(dāng)遇到文檔的開頭的時候,調(diào)用該方法,可以做一些預(yù)處理的工作
endDocument() 當(dāng)文檔結(jié)束的時候,調(diào)用該方法,可以做一些善后工作
startElement(String namespaceURI,String localName,String qName,Attributes attr) 當(dāng)讀到一個開始標(biāo)簽的時候,會觸發(fā)這個方法 參數(shù)分別為:命名空間、不帶命名空間的標(biāo)簽名、帶命名空間的標(biāo)簽名、得到的所有屬性名和相應(yīng)的值
endElement(String uri,String localName,String name) 在遇到結(jié)束標(biāo)簽的時候,調(diào)用該方法
characters(char[] ch,int start,int length) 這個方法來處理在xml文件中讀到的內(nèi)容,第一個參數(shù)用于存放文件的內(nèi)容,后面的兩個參數(shù)是讀到的字符串 在這個數(shù)組中的起始位置和長度,使用new String(ch,start,length)就可以獲取內(nèi)容
如有以下xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="10"> <name>LiMing</name> <age>30</age> </person> <person id="20"> <name>XiaoZhang</name> <age>25</age> </person> </persons>
解析過程觸發(fā)的事件為: 讀到的標(biāo)簽及內(nèi)容 觸發(fā)事件 {文檔開始} 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}") "LiMing" 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> startElement("","person",null,"{Attributes}") "\n\t\t" characters("<persons>...</persons>","98","3") <name> startElement("","name",null,"{Attributes}") "XiaoZhang" characters("<persons>...</persons>","107","3") </name> endElement("","name",null) "\n\t\t" characters("<persons>...</persons>","118","3") <age> startElement("","age",null,"{Attributes}") "25" characters("<persons>...</persons>","126","2") </age> endElement("","age",null) "\n\t\t" characters("<persons>...</persons>","135","2") </person> endElement("","person",null) "\n" characters("<persons>...</persons>","147","1") </persons> endElement
寫了一個sax解析程序,來解析該xml文件 - import org.xml.sax.Attributes;
-
import org.xml.sax.SAXException;
-
import org.xml.sax.helpers.DefaultHandler;
-
-
public class StudentInfoContentHandler2 extends DefaultHandler {
-
-
@Override
-
public void characters(char[] ch, int start, int length) throws SAXException {
-
if(person!=null) {
-
String data = new String(ch, start, length);
-
if("name".equals(tagName)) {
-
person.name = data;
-
} else if("age".equals(tagName)) {
-
person.age = Integer.valueOf(data);
-
}
-
}
-
}
-
-
@Override
-
public void endDocument() throws SAXException {
-
for(Person p : personList) {
-
System.out.println(p);
-
}
-
}
-
-
@Override
-
public void endElement(String uri, String localName, String qName) throws SAXException {
-
if("person".equals(qName)) {
-
personList.add(person);
-
person = null;
-
}
-
tagName = null;
-
}
-
-
@Override
-
public void startDocument() throws SAXException {
-
personList = new ArrayList<Person>();
-
}
-
-
@Override
-
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-
if("person".equals(qName)) {
-
person = new Person();
-
person.id = Integer.valueOf(attributes.getValue("id"));
-
} else {
-
-
}
-
tagName = qName;
-
}
-
-
List<Person> personList;
-
Person person;
-
String tagName;
-
}
-
-
-
class Person
-
{
-
@Override
-
public String toString() {
-
return "id=" + id + " name=" + name + " age=" + age;
-
}
-
public int id;
-
public String name;
-
public int age;
-
-
}
寫了一個測試程序,來測試解析過程是否正確: - import java.io.File;
-
import java.io.IOException;
-
-
import javax.xml.parsers.ParserConfigurationException;
-
import javax.xml.parsers.SAXParser;
-
import javax.xml.parsers.SAXParserFactory;
-
-
import org.xml.sax.SAXException;
-
-
-
public class SAX_XML_Parser {
-
- public static void main(String[] args) {
-
try {
-
readXml();
-
} catch (ParserConfigurationException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (SAXException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
-
private static void readXml() throws ParserConfigurationException, SAXException, IOException {
-
File file = new File("C:/studentInfo.xml");
-
SAXParserFactory spf = SAXParserFactory.newInstance();
-
SAXParser saxParser = spf.newSAXParser();
-
//saxParser.setProperty("http://xml.org/sax/features/namespaces", true);
-
StudentInfoContentHandler2 handler = new StudentInfoContentHandler2();
-
saxParser.parse(file, handler);
-
}
-
}
輸出結(jié)果: id=10 name=LiMing age=25 id=20 name=XiaoZhang age=30
|