<?xml version="1" encord="utf-8"?>
<out:persons>
<person id="9">
<name>CongHua</name>
<age>20</age>
</person>
<persons>
采用SAX解析xml文件:
startDcoument()方法:遇到文档开头时,调用这个方法,可以在其中做一些预处理工作。
endDcoument()方法:与上面相应,在文档结束时调用,可以做一些善后工作。
startElement(String namespaceURL, String localName, String qName, Attributes atts):
namespaceURL是命名空间,localName是不带命名空间,qName是标签名,atts是标签属性。
endElement(String namespaceURL, String localName, String name):namespaceURL是命名
空间,localName是不带命名空间名,name是标签名。
character(char[] ch, int start, int length):ch是整个xml文本,start文本开始位置,length是文本长度
解析条件:
<?xml version="1" encord="utf-8"?> // 触发startDocument()
<out:persons> //触发startElement("out","persons",null,"{Attributes}")
<name>CongHua</name> //触发character(" <name>...</name>,"50","7")
</person> //触发endElement(null,"person",n)
例子:
public List<Person> getSAXPerson(InputStream id) throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance() ;
SAXParser parser = factory.newSAXParser() ;
PersonHandler handler = new PersonHandler() ;
parser.parse(is,handler) ;
}
class PersonHandler extends DefaultHandler{
private List<Person> persons = null ;
private String tag = null ;
private Person person = null ;
public void startDocument() throws SAXParserException{
persons = new ArrayList<Person>() ;
}
public void startElement(String namespaceURL, String localName, String qName,
Attributes atts) throws SAXParserException{
if("peraon".equal(localName)){
person = new Person() ;
person.setId(new Integer(attribute.getValue(0))) ;
}
tag = localName ;
}
public void character(char[] ch, int start, int length) throws SAXParseException{
if(tag!=null){
String data = new String(ch,start,length) ;
if("name".equal(tag)){
person.setName(data) ;
}else if("age".equal(tag)){
person.setAge(new Short(data)) ;
}
}
}
public void endElement() throws SAXParseException{
if("person".equal(localName)){
persons.add(person) ;
person = null ;
}
}
}
使用DOM解析xml文件:
将xml内容以文档树存放在内存,使用DOM解析,代码直观,编码简单,但消耗内存较大,对于android 移动设备等内存小,不建议使用DOM解析。
例子:
public static List<Person> getPersons(InputStream is) throws Exception{
List<Person> persons = new ArrayList<Person>() ;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
DocumentBuilder builder = factory.newDocumentBuilder() ;
Document document = builder.parse(is) ; //已经解析完xml文件,存放到内存文档树
Element root = doucment.getDocumentElement() ;
NodeList personsNodes = root.getElementByTagName("person") ;
for(int i=0; i<personsNode.length(); i++){
Element personElement = (Element)personNodes.item(i);
int id = new Integer(personElement.getAttribute("id")) ;
Person person = new Person() ;
person.setId(id) ;
NodeList childNodesList = personElement.getChildNodes() ;
for(int y=0; y<childNodeList.length(); y++){
if(childNodes.item(y).getNodeType()==Node.ELEMENT_MODE){
if("name".equal(childNodes.item(y).getNodeName())){
String name = childNodes.item(y).getFirstChild().getNodeValue() ;
person.setName(name) ;
}else ("age".equal(childNodes.item(y).getNodeName())){
String age= childNodes.item(y).getFirstChild().getNodeValue() ;
person.setName(new Short(age)) ;
}
}
}
persons.add(person) ;
}
is.close() ;
return persons ;
}
使用Pull解析xml文件:
Android内置的Pull解析器,不需要添加额外jar包,android系统本身内部也使用Pull解析xml文件。推荐使用。
例子:
public static List<Person> getPullPersons(IntputStream is) throws Exception {
List<Person> persons = null ;
Person person = null ;
XmlPullParser pullParser = Xml.newPullParser() ;
pullParser.setInput(is,"UTF-8") ;
int event = pullParser.getEventType() ;
while(event!=XmlPullParser.END_DOCUMENT){
switch(event){
case XmlPullParser.START_DOCUMENT :
persons = new ArrayList<Person>() ;
break ;
case XmlPullParser.START_TAG :
if("person".equal(pullParser.getName())){
int id = new Integer(pullParser.getAttributeValue(0)) ;
person = new Person() ;
person.setId(id) ;
}
if(person!=null){
if("name".equal(pullParser.getName())){
person.setName(pullParser.nextText()) ;
}else if("age".equal(pullParser.getName())){
person.setAge(new Short(age)) ;
}
}
break ;
case XmlParser.END_TAG :
if("person".equal(pullParser.getName())){
persons.add(person) ;
person = null ;
}
}
}
}