使用SAX解析XML文件

SAX(Simple API for XML),是指一种接口,或者一个软件包。

 

DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的,此结构占用的内存较多。

SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。

 

由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。

 

SAX解析XML步骤
①创建XML解析处理器。
②创建SAX解析器。
③将XML解析处理器分配给解析器。
④对文档进行解析,将每个事件发送给处理器。

 

下面是SAX解析XML文件的代码程序,完整代码下载地址:android_sax.rar

MainActivity:

[java]  view plain copy
  1. /** 
  2.  * MainActivity 
  3.  *  
  4.  * @author zuolongsnail 
  5.  *  
  6.  */  
  7. public class MainActivity extends Activity {  
  8.     private Button parseBtn;  
  9.     private ListView listView;  
  10.     private ArrayAdapter<Person> adapter;  
  11.     private ArrayList<Person> persons;  
  12.   
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         parseBtn = (Button) findViewById(R.id.parse);  
  18.         listView = (ListView) findViewById(R.id.list);  
  19.         parseBtn.setOnClickListener(new OnClickListener() {  
  20.             @Override  
  21.             public void onClick(View v) {  
  22.                 persons = MainActivity.this.readXml();  
  23.                 adapter = new ArrayAdapter<Person>(MainActivity.this,  
  24.                         android.R.layout.simple_expandable_list_item_1, persons);  
  25.                 listView.setAdapter(adapter);  
  26.             }  
  27.         });  
  28.     }  
  29.   
  30.     private ArrayList<Person> readXml() {  
  31.         InputStream file = this.getClass().getClassLoader()  
  32.                 .getResourceAsStream("persons.xml");  
  33.         // ①创建XML解析处理器  
  34.         SAXXmlContentHandler contentHandler = new SAXXmlContentHandler();  
  35.         try {  
  36.             // 创建一个SAXParserFactory  
  37.             SAXParserFactory factory = SAXParserFactory.newInstance();  
  38.             // ②创建SAX解析器  
  39.             SAXParser parser = factory.newSAXParser();  
  40.             // ③将XML解析处理器分配给解析器  
  41.             // ④对文档进行解析,将每个事件发送给处理器。  
  42.             parser.parse(file, contentHandler);  
  43.             file.close();  
  44.   
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.         return contentHandler.getBooks();  
  49.     }  
  50. }  

 XML解析处理器:

[java]  view plain copy
  1. /** 
  2.  * 解析XML处理器 
  3.  * @author zuolongsnail 
  4.  * 
  5.  */  
  6. public class SAXXmlContentHandler extends DefaultHandler {  
  7.   
  8.     private ArrayList<Person> persons;  
  9.     private Person person;  
  10.     private String tagName;  
  11.   
  12.     public ArrayList<Person> getBooks() {  
  13.         return persons;  
  14.     }  
  15.   
  16.     @Override  
  17.     public void startDocument() throws SAXException {  
  18.         this.persons = new ArrayList<Person>();  
  19.         Log.e("SAXXmlContentHandler""开始解析XML文件");  
  20.     }  
  21.   
  22.     @Override  
  23.     public void startElement(String uri, String localName, String qName,  
  24.             Attributes attributes) throws SAXException {  
  25.         Log.e("SAXXmlContentHandler""读取标签");  
  26.         this.tagName = localName;  
  27.         if(this.tagName.equals("person")){  
  28.             person = new Person();  
  29.             person.setId(Integer.parseInt(attributes.getValue(0)));  
  30.         }  
  31.     }  
  32.     @Override  
  33.     public void characters(char[] ch, int start, int length)  
  34.             throws SAXException {  
  35.         Log.e("SAXXmlContentHandler""根据tagName获取标签的内容");  
  36.         if (this.tagName != null) {  
  37.             String data = new String(ch, start, length);  
  38.             if (this.tagName.equals("name")) {  
  39.                 this.person.setName(data);  
  40.             } else if (this.tagName.equals("age")) {  
  41.                 this.person.setAge(Integer.parseInt(data));  
  42.             }  
  43.         }  
  44.     }  
  45.     @Override  
  46.     public void endElement(String uri, String localName, String qName)  
  47.             throws SAXException {  
  48.         if(localName.equals("person")){  
  49.             this.persons.add(person);  
  50.         }  
  51.         this.tagName = null;  
  52.     }  
  53. }  

persons.xml文件:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id="1">  
  4.         <name>张三</name>  
  5.         <age>24</age>  
  6.     </person>  
  7.     <person id="2">  
  8.         <name>李四</name>  
  9.         <age>25</age>  
  10.     </person>  
  11.     <person id="3">  
  12.         <name>王五</name>  
  13.         <age>26</age>  
  14.     </person>  
  15. </persons>  

Person实体类:

[java]  view plain copy
  1. /** 
  2.  * Person实体类 
  3.  * @author zuolongsnail 
  4.  * 
  5.  */  
  6. public class Person {  
  7.     private int id;  
  8.     private String name;  
  9.     private int age;  
  10.     public Person() {  
  11.   
  12.     }  
  13.     public Person(int id, String name, int age) {  
  14.         this.id = id;  
  15.         this.name = name;  
  16.         this.age = age;  
  17.     }  
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.   
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.     public String getName() {  
  26.         return name;  
  27.     }  
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.     public void setAge(int age) {  
  35.         this.age = age;  
  36.     }  
  37.     @Override  
  38.     public String toString() {  
  39.         return "姓名:" + this.name + ",年龄:" + this.age;  
  40.     }  
  41. }  

main.xml文件:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content" android:text="@string/hello" />  
  7.     <Button android:id="@+id/parse" android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content" android:text="SAX解析XML" />  
  9.     <ListView android:id="@+id/list" android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent">  
  11.     </ListView>  
  12. </LinearLayout>  

程序运行截图:

点击解析按钮后为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值