xml解析之sax基础

前端之家收集整理的这篇文章主要介绍了xml解析之sax基础前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SAX是一种事件驱动的XMLAPI,特点:

流的方式处理,遇到标签的时候不会记下标签

分析能即刻开始,并可随时结束

所占内存小,适合大型文档


示例xml文件如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <persons>
  3. <person name="Claw" age="24">
  4. <weight>70kg</weight>
  5. <height>173cm</height>
  6. </person>
  7. <person name="Nancy" age="25">
  8. <weight>54kg</weight>
  9. <height>172cm</height>
  10. </person>
  11. <person name="dearcloud" age="27">
  12. <weight>55kg</weight>
  13. <height>172cm</height>
  14. </person>
  15. </persons>


使用方法:扩展defaultHandler实现解析细节,重写主要的五个方法,实例代码如下:

  1. package com.example.xmlparser;
  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 SaxHandler extends DefaultHandler {
  13.  
  14. HashMap<String,String> map;
  15. List<Map<String,String>> list;
  16. private String curTag;//当前标签
  17. private String curValue;//当前值
  18. private String nodeName;//当前节点名
  19. public SaxHandler(String node) {
  20. nodeName=node;
  21. }
  22.  
  23. public List<Map<String,String>> getList() {
  24. return list;
  25. }
  26.  
  27. @Override
  28. public void startDocument() throws SAXException {
  29. list=new ArrayList<Map<String,String>>();
  30. super.startDocument();
  31. }
  32. @Override
  33. public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
  34. if(qName.equals(nodeName))
  35. map=new HashMap<String,String>();
  36. if(attributes!=null&&map!=null)
  37. for(int i=0;i<attributes.getLength();i++){
  38. map.put(attributes.getQName(i),attributes.getValue(i));
  39. }
  40. curTag=qName;
  41. super.startElement(uri,localName,qName,attributes);
  42. }
  43. @Override
  44. public void characters(char[] ch,int start,int length)
  45. throws SAXException {
  46. if(curTag!=null&&map!=null){
  47. curValue=new String(ch,start,length);
  48. if(curValue!=null&&!curValue.trim().equals("")){
  49. map.put(curTag,curValue);
  50. }
  51. }
  52. super.characters(ch,length);
  53. }
  54. @Override
  55. public void endElement(String uri,String qName)
  56. throws SAXException {
  57. if(nodeName.equals(qName))
  58. list.add(map);
  59. super.endElement(uri,qName);
  60. }
  61. @Override
  62. public void endDocument() throws SAXException {
  63. super.endDocument();
  64. }
  65. }

有了这个DefaultHandler就可以解析了,解析类的静态方法如下:

  1. public static List<Map<String,String>> parseSax(InputStream is,String node){
  2. try {
  3. SAXParserFactory saxPF=SAXParserFactory.newInstance();
  4. SAXParser saxParser=saxPF.newSAXParser();
  5. SaxHandler saxHandler=new SaxHandler(node);
  6. saxParser.parse(is,saxHandler);
  7. return saxHandler.getList();
  8. } catch (Exception e) {
  9. Log.e("parse error",e.getMessage()+e.getLocalizedMessage());
  10. return null;
  11. }finally{
  12. try {
  13. is.close();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }

如此,就可以用这个方法来解析xml文件了,使用示例如下:

  1. String nodeName="person";
  2. InputStream is=getResources().openRawResource(R.raw.parsed);
  3. List<Map<String,String>> list=ParserUtil.parseSax(is,nodeName);

猜你在找的XML相关文章