歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中使用SAX對XMl文件進行解析

Android中使用SAX對XMl文件進行解析

日期:2017/3/1 10:40:00   编辑:Linux編程
在Android中的xml的文件解析,一般有三種方法 sax,dom,pull; 不過一般使用最多的是sax技術;在Java中使用SAX技術解析XML文檔 見 http://www.linuxidc.com/Linux/2012-01/51439.htm

sax解析技術是解析速度很快,並且占用很小量的內存;sax解析的方法是進行事件驅動的方法,相對於dom技術必須要調用這個xml文檔到內存中,他不需要整個xml文檔,

按順序進行解析,按要求把xml當如到內存中;當我們在解析的時候,會按照要求觸發一系列的回調方法,這些方法我們可以在ContentHandler接口中找到,不過如果實現這個接口,我們要去實現裡面所有的方法,方法比較多;不過我們可以去繼承已經實現該接口的DefaultHandler類;

本文源碼下載地址

免費下載地址在 http://linux.linuxidc.com/

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

主Activity類

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

解析效果截圖:

Copyright © Linux教程網 All Rights Reserved