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

Android创建与解析XML(三)――详解Sax方式,第1张

概述1.Sax概述SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback

1. Sax概述

SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法:

startdocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源

enddocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中做些善后工作,如:释放申请的对象资源

startElement(String namespaceURI,String localname,String qname,Attributes atts):当遇开始标签的时候就会触发这个方法。

endElement(String uri,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;

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


2、Sax 创建 XML

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

接着,factory.newtransformerHandler() 获取 transformerHandler 的 handler 对象

然后,通过 handler 事件创建handler.gettransformer()、 handler.setResult(result),以及 startdocument()、startElement、characters、endElement、enddocument()等

/** Sax方式,创建 XML */ public String saxCreateXML(){   StringWriter xmlWriter = new StringWriter();    Person []persons = new Person[3];    // 创建节点Person对象   persons[0] = new Person(1,"sunboy_2050","http://blogcsdnnet/sunboy_2050");   persons[1] = new Person(2,"baIDu","http://wwwbaIDucom");   persons[2] = new Person(3,"Google","http://wwwGooglecom");      try {     SAXtransformerFactory factory = (SAXtransformerFactory)SAXtransformerFactorynewInstance();     transformerHandler handler = factorynewtransformerHandler();          transformer transformer = handlergettransformer();   // 设置xml属性     transformersetoutputProperty(OutputKeysINDENT,"yes");     transformersetoutputProperty(OutputKeysENCoding,"utf-8");     transformersetoutputProperty(OutputKeysveRSION,"0");          StreamResult result = new StreamResult(xmlWriter);   // 保存创建的xml     handlersetResult(result);          handlerstartdocument();     AttributesImpl attr = new AttributesImpl();          attrclear();     atTraddAttribute("","","author","homer");     atTraddAttribute("","date","2012-04-27");     handlerstartElement("","root",attr);          int personsLen = personslength;     for(int i=0; i<personsLen; i++){       attrclear();       handlerstartElement("","person",attr);              attrclear();       handlerstartElement("","ID",attr);       String ID = persons[i]getID() + "";       handlercharacters(IDtochararray(),IDlength());       handlerendElement("","ID");        attrclear();       handlerstartElement("","name",attr);       String name = persons[i]getname();       handlercharacters(nametochararray(),namelength());       handlerendElement("","name");        attrclear();       handlerstartElement("","blog",attr);       String blog = persons[i]getBlog();       handlercharacters(blogtochararray(),bloglength());       handlerendElement("","blog");              handlerendElement("","person");     }          handlerendElement("","root");     handlerenddocument();        } catch (transformerFactoryConfigurationError e) {   // SAXtransformerFactorynewInstance     eprintstacktrace();   } catch (transformerConfigurationException e) {     // factorynewtransformerHandler     eprintstacktrace();   } catch (IllegalArgumentException e) {   // transformersetoutputProperty     eprintstacktrace();   } catch (SAXException e) {   // handlerstartdocument     eprintstacktrace();   } catch (Exception e) {     eprintstacktrace();   }      savedXML(filename,xmlWritertoString());   return xmlWritertoString(); } 

运行结果:


3、Sax解析XML
 

  /** Sax方式,解析 XML */   public String saxResolveXML(){     StringWriter xmlWriter = new StringWriter();      inputStream is = readxml(filename);     try {       SAXParserFactory factory = SAXParserFactorynewInstance();       SAXParser saxParser = factorynewSAXParser();              PersonHandler handler = new PersonHandler();  // person处理Handler       saxParserparse(is,handler);          // handler解析xml              // 获取解析的xml       String xmlheader = handlergetXMLheader();       xmlWriterappend(xmlheader);              List<Person> personsList = handlergetPersons();       int personsLen = personsListsize();       for(int i=0; i<personsLen; i++){         xmlWriterappend(personsListget(i)toString())append("\n");       }            } catch (FactoryConfigurationError e) {     // SAXParserFactorynewInstance       eprintstacktrace();     } catch (ParserConfigurationException e) {   // factorynewSAXParser       eprintstacktrace();     } catch (SAXException e) {     // factorynewSAXParser       eprintstacktrace();     } catch (IllegalArgumentException e) {   // saxParserparse       eprintstacktrace();     } catch (IOException e) {      // saxParserparse       eprintstacktrace();     } catch (Exception e) {       eprintstacktrace();     }          return xmlWritertoString();   }      /** Handler处理类 */   private final class PersonHandler extends DefaultHandler{     private List<Person> personsList = null; // 保存person     private Person person = null;     private StringBuffer xmlheader;       // 保存xml头部信息     private String tag = null;     // xml Element          /** 返回解析的xml头部信息 */     public String getXMLheader(){       return xmlheadertoString();     }          /** 返回解析的Person实例数组 */     public List<Person> getPersons(){       return personsList;     }          @OverrIDe     public voID startdocument() throws SAXException{       superstartdocument();       personsList = new ArrayList<Person>();       xmlheader = new StringBuffer();     }          @OverrIDe     public voID startElement(String uri,Attributes attributes) throws SAXException{       superstartElement(uri,localname,qname,attributes);       if("root"equals(localname)) {         String attrAuthor = attributesgetValue(0);         String attrDate = attributesgetValue(1);         xmlheaderappend("root")append("\t\t");         xmlheaderappend(attrAuthor)append("\t");         xmlheaderappend(attrDate)append("\n");       } else if("person"equals(localname)) {         person = new Person();       }        tag = localname;     }          @OverrIDe     public voID characters(char[] ch,int length) throws SAXException {       supercharacters(ch,length);       if (null != tag) {         String value = new String(ch,length);         Systemoutprintln("value = " + value);         if ("ID"equals(tag)) {           personsetID(new Integer(value));         } else if ("name"equals(tag)) {           personsetname(value);         } else if ("blog"equals(tag)) {           personsetBlog(value);         }       }     }          @OverrIDe     public voID endElement(String uri,String qname) throws SAXException {       if("person"equals(qname)) {         personsListadd(person);         person = null;       }       tag = null;       superendElement(uri,qname);     }          @OverrIDe     public voID enddocument() throws SAXException{ //     personsList = null;       superenddocument();     }   } 

运行结果:


4、Person类

请参见前文Android 创建与解析XML(二)―― Dom方式 【4、Person类】

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的Android创建与解析XML(三)――详解Sax方式全部内容,希望文章能够帮你解决Android创建与解析XML(三)――详解Sax方式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1147586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存