Android中使用SAX对XMl文件进行解析


在Android中的xml的文件解析,一般有三种方法 sax,dom,pull; 不过一般使用最多的是sax技术;在Java中使用SAX技术解析XML文档 见

sax解析技术是解析速度很快,并且占用很小量的内存;sax解析的方法是进行事件驱动的方法,相对于dom技术必须要调用这个xml文档到内存中,他不需要整个xml文档,

按顺序进行解析,按要求把xml当如到内存中;当我们在解析的时候,会按照要求触发一系列的回调方法,这些方法我们可以在ContentHandler接口中找到,不过如果实现这个接口,我们要去实现里面所有的方法,方法比较多;不过我们可以去继承已经实现该接口的DefaultHandler类;

本文源码下载地址

免费下载地址在 http://linux.bkjia.com/

用户名与密码都是www.bkjia.com

具体下载目录在 /2012年资料/1月/13日/Android中使用SAX对XMl文件进行解析/

 

可以重写一下一些方法:

1:  startDocument()  这是解析到文档开始的时候,可以去做一些初始化或者预处理的事情

2:endDocument()  这是解析到文档结束的时候,可以去做一些收尾的事情

3:startElement(StringnamespaceURI, StringlocalName, StringqName, Attributesatts

    这是读到一个元素的时候,会触发这个方法  参数意思:

namespaceURI 命名空间,如果没有命名空间填写"";  localName:当前解析到的元素名字; qName:命名空间+当前解析到的元素名字;atts:当前解析到元素的属性

4:endElement(Stringuri, StringlocalName, String name)

这个方法和

startElement

方法相对应,在遇到结束标签的时候,调用.

5:characters(char[]ch,int start,int length)   调用这个方法,取出解析到的文本内容

  

  使用步骤:(使用以下的XML文件)

<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<name>张三</name>
<age>30</age>
</student>
<student id="2">
<name>李四</name>
<age>24</age>
</student>
</students>

  1:创建继承于DefaultHandler解析帮组类;

  2:在创建读取方法里面进行SAX解析:

    SAXParserFactory spf = SAXParserFactory.newInstance();
   SAXParser parser = spf.newSAXParser();
   SAXXMLHandler handler = new SAXXMLHandler();
   parser.parse(inputStream, handler);

  

下面直接看Demo代码:

  解析帮助类:

  

[java]
  1. package com.jiangqq.sax;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.xml.sax.Attributes;  
  7. import org.xml.sax.SAXException;  
  8. import org.xml.sax.helpers.DefaultHandler;  
  9.   
  10. import com.jiangqq.bean.Person;  
  11. import com.jiangqq.bean.Student;  
  12.   
  13. public class SAXXMLHandler extends DefaultHandler {  
  14.   
  15.     private Student student;  
  16.     private List<Student> list;  
  17.     private String tag;  
  18.   
  19.     public List<Student> getList() {  
  20.         return list;  
  21.     }  
  22.   
  23.     @Override  
  24.     public void startDocument() throws SAXException {  
  25.   
  26.         super.startDocument();  
  27.         list = new ArrayList<Student>();  
  28.     }  
  29.   
  30.     @Override  
  31.     public void endDocument() throws SAXException {  
  32.         super.endDocument();  
  33.     }  
  34.   
  35.     @Override  
  36.     public void startElement(String uri, String localName, String qName,  
  37.             Attributes attributes) throws SAXException {  
  38.         super.startElement(uri, localName, qName, attributes);  
  39.         if ("student".equals(localName)) {  
  40.             student = new Student();  
  41.             student.setId(new Integer(attributes.getValue("""id")));  
  42.         }  
  43.         tag = localName;  
  44.     }  
  45.   
  46.     @Override  
  47.     public void endElement(String uri, String localName, String qName)  
  48.             throws SAXException {  
  49.         super.endElement(uri, localName, qName);  
  50.         if (student != null && localName.equals("student")) {  
  51.             list.add(student);  
  52.             student = null;  
  53.   
  54.         }  
  55.         tag = null;  
  56.     }  
  57.   
  58.     @Override  
  59.     public void characters(char[] ch, int start, int length)  
  60.             throws SAXException {  
  61.         super.characters(ch, start, length);  
  62.         if ("name".equals(tag)) {  
  63.             if (student != null) {  
  64.                 student.setName(new String(ch, start, length));  
  65.             }  
  66.         } else if ("age".equals(tag)) {  
  67.             if (student != null) {  
  68.                 student.setAge(new Short(new String(ch, start, length)));  
  69.             }  
  70.         }  
  71.     }  
  72. }  

主Activity类

  

[java]
  1. package com.jiangqq.activity;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.List;  
  5.   
  6. import javax.xml.parsers.SAXParser;  
  7. import javax.xml.parsers.SAXParserFactory;  
  8.   
  9. import com.jiangqq.bean.Person;  
  10. import com.jiangqq.bean.Student;  
  11. import com.jiangqq.sax.R;  
  12. import com.jiangqq.sax.SAXXMLHandler;  
  13.   
  14. import android.app.Activity;  
  15. import android.os.Bundle;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.TextView;  
  20. import android.widget.Toast;  
  21.   
  22. public class XmlMainActivity extends Activity {  
  23.     private Button saxbtn;  
  24.     private TextView tv;  
  25.     private List<Student> students;  
  26.   
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         saxbtn = (Button) findViewById(R.id.et1);  
  32.         tv = (TextView) findViewById(R.id.tv);  
  33.         saxbtn.setOnClickListener(new OnClickListener() {  
  34.   
  35.             @Override  
  36.             public void onClick(View v) {  
  37.                 InputStream inputStream = XmlMainActivity.class  
  38.                         .getClassLoader().getResourceAsStream("student.xml");  
  39.                 students = readSAXXML(inputStream);  
  40.                 String string = "使用SAX解析结果如下:" + "\n";  
  41.                 for (Student student : students) {  
  42.                     string += student.toString();  
  43.                     string += "\n";  
  44.                 }  
  45.                 tv.setText(string);  
  46.             }  
  47.         });  
  48.     }  
  49.   
  50.     public List<Student> readSAXXML(InputStream inputStream) {  
  51.         try {  
  52.   
  53.             SAXParserFactory spf = SAXParserFactory.newInstance();  
  54.             SAXParser parser = spf.newSAXParser();  
  55.             SAXXMLHandler handler = new SAXXMLHandler();  
  56.             parser.parse(inputStream, handler);  
  57.             inputStream.close();  
  58.             return handler.getList();  
  59.         } catch (Exception e) {  
  60.             Toast.makeText(this"使用SAX进行XML文件解析失败", Toast.LENGTH_LONG).show();  
  61.         }  
  62.         return null;  
  63.     }  
  64. }  

解析效果截图:

 

相关内容