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

http://blog.csdn.net/sunboy_2050/article/details/7521598

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 的效果图:

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
copyprint?

  1. /** Sax方式,创建 XML  */  
  2. public String saxCreateXML(){  
  3.     StringWriter xmlWriter = new StringWriter();  
  4.   
  5.     Person []persons = new Person[3];       // 创建节点Person对象  
  6.     persons[0] = new Person(1, "sunboy_2050", "http://blog.csdn.net/sunboy_2050");  
  7.     persons[1] = new Person(2, "baidu", "http://www.baidu.com");  
  8.     persons[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.         Transformer transformer = handler.getTransformer();     // 设置xml属性  
  15.         transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
  16.         transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");  
  17.         transformer.setOutputProperty(OutputKeys.VERSION, "1.0");  
  18.           
  19.         StreamResult result = new StreamResult(xmlWriter);      // 保存创建的xml  
  20.         handler.setResult(result);  
  21.           
  22.         handler.startDocument();  
  23.         AttributesImpl attr = new AttributesImpl();  
  24.           
  25.         attr.clear();  
  26.         attr.addAttribute("", "", "author", "", "homer");  
  27.         attr.addAttribute("", "", "date", "", "2012-04-27");  
  28.         handler.startElement("", "", "root", attr);  
  29.           
  30.         int personsLen = persons.length;  
  31.         for(int i=0; i<personsLen; i++){  
  32.             attr.clear();  
  33.             handler.startElement("", "", "person", attr);  
  34.               
  35.             attr.clear();  
  36.             handler.startElement("", "", "id", attr);  
  37.             String id = persons[i].getId() + "";  
  38.             handler.characters(id.toCharArray(), 0, id.length());  
  39.             handler.endElement("", "", "id");  
  40.   
  41.             attr.clear();  
  42.             handler.startElement("", "", "name", attr);  
  43.             String name = persons[i].getName();  
  44.             handler.characters(name.toCharArray(), 0, name.length());  
  45.             handler.endElement("", "", "name");  
  46.   
  47.             attr.clear();  
  48.             handler.startElement("", "", "blog", attr);  
  49.             String blog = persons[i].getBlog();  
  50.             handler.characters(blog.toCharArray(), 0, blog.length());  
  51.             handler.endElement("", "", "blog");  
  52.               
  53.             handler.endElement("", "", "person");  
  54.         }  
  55.           
  56.         handler.endElement("", "", "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. }  

运行结果:

3、Sax解析XML

Code

[java] view
plain
copyprint?

  1.     /** Sax方式,解析 XML  */  
  2.     public String saxResolveXML(){  
  3.         StringWriter xmlWriter = new StringWriter();  
  4.   
  5.         InputStream is = readXML(fileName);  
  6.         try {  
  7.             SAXParserFactory factory = SAXParserFactory.newInstance();  
  8.             SAXParser saxParser = factory.newSAXParser();  
  9.               
  10.             PersonHandler handler = new PersonHandler();    // person处理Handler  
  11.             saxParser.parse(is, handler);                   // 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.                 xmlWriter.append(personsList.get(i).toString()).append("\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.             personsList = new ArrayList<Person>();  
  61.             xmlHeader = 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.                 String attrAuthor = attributes.getValue(0);  
  69.                 String attrDate = attributes.getValue(1);  
  70.                 xmlHeader.append("root").append("\t\t");  
  71.                 xmlHeader.append(attrAuthor).append("\t");  
  72.                 xmlHeader.append(attrDate).append("\n");  
  73.             } else if("person".equals(localName)) {  
  74.                 person = 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.                 String value = new String(ch, start, length);  
  84.                 System.out.println("value = " + value);  
  85.                 if ("id".equals(tag)) {  
  86.                     person.setId(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.                 person = null;  
  100.             }  
  101.             tag = 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.     }  

运行结果:

时间: 2024-10-31 11:42:44

Android 创建与解析XML(三)—— Sax方式的相关文章

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

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

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

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

Android 创建与解析XML(五)——详解Dom4j方式_Android

1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:dom4j  dom4j源码下载:dom4j download 本示例中,需要导入dom4

Android 创建与解析XML(五)——详解Dom4j方式

1.Dom4j概述 dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. dom4j官方网址:dom4j dom4j源码下载:dom4j download 本示例中,需要导入dom4j

Android 创建与解析XML(四)——详解Pull方式_Android

 1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,st

Android 创建与解析XML(四)——详解Pull方式

1.Pull概述 Android系统中和创建XML相关的包为org.xmlpull.v1,在这个包中不仅提供了用于创建XML的 XmlSerializer,还提供了用来解析XML的Pull方式解析器 XmlPullParser XmlSerializer没有像XmlPullParser那样提取XML事件,而是把它们推出到数据流OutputStream或Writer中. XmlSerializer提供了很直观的API,即使用startDocument开始文档,endDocument结束文档,sta

Android创建与解析XML(六) 比较与使用

前面介绍了四种创建.解析XML的方式: 0. Android 创建与解析XML(一)-- 概述 1. Android 创建与 解析XML(二)-- Dom方式 2. Android 创建与解析XML(三)-- Sax方式 3. Android 创建与解析XML(四 )-- Pull方式 4. Android 创建与解析XML(五)-- Dom4j方式 其中,从处理方式看,有的采用了Java处理 XML的标准方式,有的是经过第三方改进后的XML处理方式:从事件角度看,有的是基于Dom树节点,有的基

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

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

Android 创建与解析XML(二)—— Dom方式

1. Dom概述 Dom方式创建XML,应用了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML 文档,需要导入以下内容 javax.xml.parsers javax.xml.parsers.DocumentBuilder  javax.xml.parsers.DocumentBuilderFactory  javax.xml.parsers.ParserConfigurationException; javax.xml.transform j