三种常用的解析XML文档的方法:
XML文档结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>name_one</name>
<age>25</age>
</person>
<person id="2">
<name>name_two</name>
<age>26</age>
</person>
<person id="3">
<name>name_three</name>
<age>32</age>
</person>
</persons>
(1)、利用SAX解析:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXReader extends DefaultHandler {
private Person person ;
private List<Person> list = null ;
private String tag = null ;
@Override
public void startDocument() throws SAXException {
list = new ArrayList<Person>() ;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if("person".equals(localName)){
person = new Person() ;
person.setId(new Integer(attributes.getValue("id"))) ;
}
tag = localName ;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(tag!=null){
String data = String.valueOf(ch, start, length) ;
if("name".equals(tag)){
person.setName(data) ;
}
if("age".equals(tag)){
person.setAge(new Short(data)) ;
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
list.add(person) ;
person = null ;
}
tag = null ;
}
}
如下方法调用上述的解析类进行解析:
public List<Person> getPersons(InputStream inStream) throws Exception {
//创建一个SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance() ;
//创建一个解析器
SAXParser parser = factory.newSAXParser() ;
SAXReader saxReader = new SAXReader() ;
parser.parse(inStream, saxReader) ;
return saxReader.getPersons() ;
}
(2)、利用DOM解析
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOMPersonService {
//以文档树的形式存储在内存中(手机中不建议使用此方法解析,浪费内存)
public static List<Person> getPersons(InputStream inStream) throws Exception {
List<Person> list = new ArrayList<Person>() ;
Person person = null ;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
DocumentBuilder build = factory.newDocumentBuilder() ;
Document document = build.parse(inStream) ;
Element root = document.getDocumentElement() ;
NodeList personNodes = root.getElementsByTagName("person") ;
for(int i=0;i<personNodes.getLength();i++){
person = new Person() ;
Element personElement = (Element)personNodes.item(i) ;
person.setId(new Integer(personElement.getAttribute("id"))) ;
NodeList personChilds = personElement.getChildNodes() ;
for(int t=0;t<personChilds.getLength();t++){
if(personChilds.item(t).getNodeType()==Node.ELEMENT_NODE){
if("name".equals(personChilds.item(t).getNodeName())){
person.setName(personChilds.item(t).getFirstChild().getNodeValue()) ;
}
if("age".equals(personChilds.item(t).getNodeName())){
person.setAge(new Short(personChilds.item(t).getFirstChild().getNodeValue())) ;
}
}
}
list.add(person) ;
}
return list ;
}
}
(3)、Pull解析:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
public class PullPersonService {
public static List<Person> getPersons(InputStream inStream) throws Exception {
List<Person> list = null ;
Person person = null ;
//创建一个文档解析器
XmlPullParser parser = Xml.newPullParser() ;
parser.setInput(inStream, "UTF-8") ;
int eventType = parser.getEventType() ; //得到当前解析的事件
while(eventType!=XmlPullParser.END_DOCUMENT){ //只要不是文档结束事件,则不断的循环解析
switch(eventType){
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Person>() ;
break ;
case XmlPullParser.START_TAG:
String name = parser.getName() ; //获取解析器当前指向的元素名称
if("person".equals(name)){
person = new Person() ;
person.setId(new Integer(parser.getAttributeValue(0))) ;
}
if(person!=null){
if("name".equals(name)){
person.setName(parser.nextText()) ;
}
if("age".equals(name)){
person.setAge(new Short(parser.nextText())) ;
}
}
break ;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
list.add(person) ;
person = null ;
}
break ;
}
eventType = parser.next() ; //得到下一个解析事件
}
return list ;
}
}