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>
实现步骤如下:
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 }
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 }
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 }
3. 运行效果
点击"Parse By SAX" 按钮时,会把XML中的数据显示到ListView上。