1. Sax概述


SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法:
startDocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源


endDocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中做些善后工作,如:释放申请的对象资源
startElement(String namespaceURI, String localName, String qName, Attributes atts):当遇开始标签的时候就会触发这个方法。
endElement(String uri, String localName, String name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch, int start, int length):当遇到xml内容时触发这个方法,用new String(ch,start,length)可以接受内容。 



Sax方式创建XML,应用了标准xml构造器 javax.xml.transform.sax.TransformerHandler 事件来创建 XML 文档,需要导入以下内容


javax.xml.transform

javax.xml.transform.sax.SAXTransformerFactory;

javax.xml.transform.sax.TransformerHandler;

javax.xml.transform.Transformer;

javax.xml.transform.TransformerConfigurationException;

javax.xml.transform.TransformerFactoryConfigurationError;

javax.xml.transform.OutputKeys;
javax.xml.transform.stream.StreamResult;

javax.xml.transform.sax.SAXTransformerFactory;

javax.xml.parsers

javax.xml.parsers.SAXParser;

javax.xml.parsers.SAXParserFactory;

javax.xml.parsers.FactoryConfigurationError;

javax.xml.parsers.ParserConfigurationException;

org.xml.sax

org.xml.sax.Attributes;

org.xml.sax.SAXException;
org.xml.sax.helpers.AttributesImpl;

org.xml.sax.helpers.DefaultHandler;

sdk源码查看路径(​​google code​​)

Sax 创建和解析 XML 的效果图:


Android 创建与解析XML(三)—— Sax方式_android

2、Sax 创建 XML

首先,SAXTransformerFactory.newInstance() 创建一个工厂实例 factory

接着,factory.newTransformerHandler() 获取 TransformerHandler 的 handler 对象

然后,通过 handler 事件创建handler.getTransformer()、 handler.setResult(result),以及 startDocument()、startElement、characters、endElement、endDocument()等

Code


[java]  ​​view plain​​ ​​copy​​ ​​print​​ ​​?​​



  1. /** Sax方式,创建 XML  */  
  2. public String saxCreateXML(){  
  3. new StringWriter();  
  4.   
  5. new Person[3];       // 创建节点Person对象  
  6. 0] = new Person(1, "sunboy_2050", "
  7. 1] = new Person(2, "baidu", "http://www.baidu.com");  
  8. 2] = new Person(3, "google", "http://www.google.com");  
  9.       
  10. try {  
  11.         SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();  
  12.         TransformerHandler handler = factory.newTransformerHandler();  
  13.           
  14. // 设置xml属性  
  15. "yes");  
  16. "utf-8");  
  17. "1.0");  
  18.           
  19. new StreamResult(xmlWriter);      // 保存创建的xml  
  20.         handler.setResult(result);  
  21.           
  22.         handler.startDocument();  
  23. new AttributesImpl();  
  24.           
  25.         attr.clear();  
  26. "", "", "author", "", "homer");  
  27. "", "", "date", "", "2012-04-27");  
  28. "", "", "root", attr);  
  29.           
  30. int personsLen = persons.length;  
  31. for(int i=0; i<personsLen; i++){  
  32.             attr.clear();  
  33. "", "", "person", attr);  
  34.               
  35.             attr.clear();  
  36. "", "", "id", attr);  
  37. "";  
  38. 0, id.length());  
  39. "", "", "id");  
  40.   
  41.             attr.clear();  
  42. "", "", "name", attr);  
  43.             String name = persons[i].getName();  
  44. 0, name.length());  
  45. "", "", "name");  
  46.   
  47.             attr.clear();  
  48. "", "", "blog", attr);  
  49.             String blog = persons[i].getBlog();  
  50. 0, blog.length());  
  51. "", "", "blog");  
  52.               
  53. "", "", "person");  
  54.         }  
  55.           
  56. "", "", "root");  
  57.         handler.endDocument();  
  58.           
  59. catch (TransformerFactoryConfigurationError e) {      // SAXTransformerFactory.newInstance  
  60.         e.printStackTrace();  
  61. catch (TransformerConfigurationException e) {         // factory.newTransformerHandler  
  62.         e.printStackTrace();  
  63. catch (IllegalArgumentException e) {      // transformer.setOutputProperty  
  64.         e.printStackTrace();  
  65. catch (SAXException e) {      // handler.startDocument  
  66.         e.printStackTrace();  
  67. catch (Exception e) {  
  68.         e.printStackTrace();  
  69.     }  
  70.       
  71.     savedXML(fileName, xmlWriter.toString());  
  72. return xmlWriter.toString();  
  73. }  



运行结果:


Android 创建与解析XML(三)—— Sax方式_xml_02

3、Sax解析XML

Code


[java]  ​​view plain​​ ​​copy​​ ​​print​​ ​​?​​



  1.     /** Sax方式,解析 XML  */  
  2. public String saxResolveXML(){  
  3. new StringWriter();  
  4.   
  5.         InputStream is = readXML(fileName);  
  6. try {  
  7.             SAXParserFactory factory = SAXParserFactory.newInstance();  
  8.             SAXParser saxParser = factory.newSAXParser();  
  9.               
  10. new PersonHandler();    // person处理Handler  
  11. // handler解析xml  
  12.               
  13. // 获取解析的xml  
  14.             String xmlHeader = handler.getXMLHeader();  
  15.             xmlWriter.append(xmlHeader);  
  16.               
  17.             List<Person> personsList = handler.getPersons();  
  18. int personsLen = personsList.size();  
  19. for(int i=0; i<personsLen; i++){  
  20. "\n");  
  21.             }  
  22.               
  23. catch (FactoryConfigurationError e) {         // SAXParserFactory.newInstance  
  24.             e.printStackTrace();  
  25. catch (ParserConfigurationException e) {      // factory.newSAXParser  
  26.             e.printStackTrace();  
  27. catch (SAXException e) {          // factory.newSAXParser  
  28.             e.printStackTrace();  
  29. catch (IllegalArgumentException e) {      // saxParser.parse  
  30.             e.printStackTrace();  
  31. catch (IOException e) {           // saxParser.parse  
  32.             e.printStackTrace();  
  33. catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.           
  37. return xmlWriter.toString();  
  38.     }  
  39.       
  40. /** Handler处理类 */  
  41. private final class PersonHandler extends DefaultHandler{  
  42. private List<Person> personsList = null;  // 保存person  
  43. private Person person = null;  
  44. private StringBuffer xmlHeader;             // 保存xml头部信息  
  45. private String tag = null;          // xml Element  
  46.           
  47. /** 返回解析的xml头部信息 */  
  48. public String getXMLHeader(){  
  49. return xmlHeader.toString();  
  50.         }  
  51.           
  52. /** 返回解析的Person实例数组 */  
  53. public List<Person> getPersons(){  
  54. return personsList;  
  55.         }  
  56.           
  57. @Override  
  58. public void startDocument() throws SAXException{  
  59. super.startDocument();  
  60. new ArrayList<Person>();  
  61. new StringBuffer();  
  62.         }  
  63.           
  64. @Override  
  65. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{  
  66. super.startElement(uri, localName, qName, attributes);  
  67. if("root".equals(localName)) {  
  68. 0);  
  69. 1);  
  70. "root").append("\t\t");  
  71. "\t");  
  72. "\n");  
  73. else if("person".equals(localName)) {  
  74. new Person();  
  75.             }   
  76.             tag = localName;  
  77.         }  
  78.           
  79. @Override  
  80. public void characters(char[] ch, int start, int length) throws SAXException {  
  81. super.characters(ch, start, length);  
  82. if (null != tag) {  
  83. new String(ch, start, length);  
  84. "value = " + value);  
  85. if ("id".equals(tag)) {  
  86. new Integer(value));  
  87. else if ("name".equals(tag)) {  
  88.                     person.setName(value);  
  89. else if ("blog".equals(tag)) {  
  90.                     person.setBlog(value);  
  91.                 }  
  92.             }  
  93.         }  
  94.           
  95. @Override  
  96. public void endElement(String uri, String localName, String qName) throws SAXException {  
  97. if("person".equals(qName)) {  
  98.                 personsList.add(person);  
  99. null;  
  100.             }  
  101. null;  
  102. super.endElement(uri, localName, qName);  
  103.         }  
  104.           
  105. @Override  
  106. public void endDocument() throws SAXException{  
  107. //          personsList = null;  
  108. super.endDocument();  
  109.         }  
  110.     }  



运行结果:


Android 创建与解析XML(三)—— Sax方式_文档_03