Android 中使用SAX解析XML实例

1. SAX
 SAX, 即Simple API for XML的缩写,是一种事件驱动的用于解析XML的API。

 解析器是XMLReader,事件处理器是ContentHandler接口。

2. 实例说明

 下面是一个包含人员信息的XML,需要完成的功能是用SAX解析人员信息,然后在Android App中用ListView显示。

<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="20042782" name="leon" />
<person id="20042783" name="pepe" />
<person id="20042784" name="ozil" />
<person id="20042785" name="kaka" />
<person id="20042786" name="ronaldo" />
<person id="20042787" name="benzema" />
<person id="20042788" name="owen" />
<person id="20042789" name="beckham" />
<person id="20042790" name="figo" />
<person id="20042791" name="zidan" />
</persons>
View XML

实现步骤如下:

1)实现自己的事件处理器类SAXParseHandler,向外提供接口getData(),返回解析后的数据

 1 package com.example.saxdemo.sax;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import org.xml.sax.Attributes;
 9 import org.xml.sax.SAXException;
10 import org.xml.sax.helpers.DefaultHandler;
11 
12 public class SAXParseHandler extends DefaultHandler {
13 
14     List<Map<String, Object>> list;
15     HashMap<String, Object> item;
16     
17     public List<Map<String, Object>> getData(){
18         return list;
19     }
20     
21     @Override
22     public void characters(char[] ch, int start, int length)
23             throws SAXException {
24         // TODO Auto-generated method stub
25         super.characters(ch, start, length);
26     }
27 
28     @Override
29     public void endDocument() throws SAXException {
30         // TODO Auto-generated method stub
31         super.endDocument();
32     }
33 
34     @Override
35     public void endElement(String uri, String localName, String qName)
36             throws SAXException {
37         // TODO Auto-generated method stub
38         super.endElement(uri, localName, qName);
39         if (localName.equals("person")){
40             list.add(item);
41         }
42     }
43 
44     @Override
45     public void startDocument() throws SAXException {
46         // TODO Auto-generated method stub
47         super.startDocument();
48         list = new ArrayList<Map<String, Object>>();
49     }
50 
51     @Override
52     public void startElement(String uri, String localName, String qName,
53             Attributes attributes) throws SAXException {
54         // TODO Auto-generated method stub
55         super.startElement(uri, localName, qName, attributes);
56         item = new HashMap<String, Object>();
57         if (localName.equals("person")){
58             for (int i=0; i<attributes.getLength(); i++){
59                 item.put(attributes.getLocalName(i), attributes.getValue(i));
60             }
61         }
62     }
63 
64 }
View SAXParseHandler

2) 在Activity中实现解析XML并得到ListView需要的数据的接口
   步骤:实例化一个SAXParseFactory --> 实例化SAXParser对象 --> 实例化事件处理器 --> 为XMLReader解析器注册一个事件处理器 --> 获取需要解析的XML文件的文件流 --> 开始解析XMLReader.parse()

 1 List<Map<String, Object>> getData() throws ParserConfigurationException, SAXException, IOException{
 2         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
 3         SAXParser saxParser = saxParserFactory.newSAXParser();
 4         XMLReader xmlReader = saxParser.getXMLReader();
 5         SAXParseHandler saxParseHandler = new SAXParseHandler();
 6         xmlReader.setContentHandler(saxParseHandler);
 7         
 8         InputStream inputStream = getResources().openRawResource(R.raw.persons);
 9         xmlReader.parse(new InputSource(inputStream));
10         return saxParseHandler.getData();
11     }
View Parse XML Function

3) 用SimpleAdapter装载ListView

 1 @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.activity_main);
 5         
 6         parseBtn = (Button) findViewById(R.id.button1);
 7         listView = (ListView) findViewById(R.id.listView1);
 8         
 9         parseBtn.setOnClickListener(new OnClickListener() {
10             
11             @Override
12             public void onClick(View v) {
13                 // TODO Auto-generated method stub
14                 SimpleAdapter adapter = null;
15                 try {
16                     adapter = new SimpleAdapter(MainActivity.this, getData(), R.layout.person,
17                             new String[]{"name", "id"}, 
18                             new int[]{R.id.person_name, R.id.person_id});
19                     listView.setAdapter(adapter);
20                 } catch (ParserConfigurationException e) {
21                     // TODO Auto-generated catch block
22                     e.printStackTrace();
23                 } catch (SAXException e) {
24                     // TODO Auto-generated catch block
25                     e.printStackTrace();
26                 } catch (IOException e) {
27                     // TODO Auto-generated catch block
28                     e.printStackTrace();
29                 }
30             }
31         });
32     }
View Add SimpleAdapter to ListView

3. 运行效果

点击"Parse By SAX" 按钮时,会把XML中的数据显示到ListView上。

 

posted on 2013-05-17 15:02  leon.li  阅读(181)  评论(0编辑  收藏  举报

导航