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;
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
-
- publicStringsaxCreateXML(){
- StringWriterxmlWriter=newStringWriter();
-
- Person[]persons=newPerson[3];
- persons[0]=newPerson(1,"sunboy_2050","http://blog.csdn.net/sunboy_2050");
- 1]=newPerson(2,"baidu","http://www.baidu.com");
- 2]=newPerson(3,"google","http://www.google.com");
-
- try{
- SAXTransformerFactoryfactory=(SAXTransformerFactory)SAXTransformerFactory.newInstance();
- TransformerHandlerhandler=factory.newTransformerHandler();
- Transformertransformer=handler.getTransformer();
- transformer.setOutputProperty(OutputKeys.INDENT,"yes");
- transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
- transformer.setOutputProperty(OutputKeys.VERSION,"1.0");
- StreamResultresult=newStreamResult(xmlWriter);
- handler.setResult(result);
- handler.startDocument();
- AttributesImplattr=newAttributesImpl();
- attr.clear();
- attr.addAttribute("","","author","homer");
- "date","2012-04-27");
- handler.startElement("","root",attr);
- intpersonsLen=persons.length;
- for(inti=0;i<personsLen;i++){
- attr.clear();
- "person",attr);
- "id",226)"> Stringid=persons[i].getId()+"";
- handler.characters(id.toCharArray(),0,id.length());
- handler.endElement("","id");
- "name",226)"> Stringname=persons[i].getName();
- handler.characters(name.toCharArray(),name.length());
- "name");
- "blog",226)"> Stringblog=persons[i].getBlog();
- handler.characters(blog.toCharArray(),blog.length());
- "blog");
- "person");
- }
- "root");
- handler.endDocument();
- }catch(TransformerFactoryConfigurationErrore){
- e.printStackTrace();
- }catch(TransformerConfigurationExceptione){
- }catch(IllegalArgumentExceptione){
- }catch(SAXExceptione){
- }catch(Exceptione){
- }
- savedXML(fileName,xmlWriter.toString());
- returnxmlWriter.toString();
- }
运行结果:
3、Sax解析XML
Code
- publicStringsaxResolveXML(){
- InputStreamis=readXML(fileName);
- SAXParserFactoryfactory=SAXParserFactory.newInstance();
- SAXParsersaxParser=factory.newSAXParser();
- PersonHandlerhandler=newPersonHandler();
- saxParser.parse(is,handler);
- //获取解析的xml
- StringxmlHeader=handler.getXMLHeader();
- xmlWriter.append(xmlHeader);
- List<Person>personsList=handler.getPersons();
- intpersonsLen=personsList.size();
- xmlWriter.append(personsList.get(i).toString()).append("n");
- }catch(FactoryConfigurationErrore){
- }catch(ParserConfigurationExceptione){
- //saxParser.parse
- }catch(IOExceptione){
- /**Handler处理类*/
- privatefinalclassPersonHandlerextendsDefaultHandler{
- privateList<Person>personsList=null;
- privatePersonperson=null;
- privateStringBufferxmlHeader;
- privateStringtag=null;
- /**返回解析的xml头部信息*/
- publicStringgetXMLHeader(){
- returnxmlHeader.toString();
- /**返回解析的Person实例数组*/
- publicList<Person>getPersons(){
- returnpersonsList;
- @Override
- publicvoidstartDocument()throwsSAXException{
- super.startDocument();
- personsList=newArrayList<Person>();
- xmlHeader=newStringBuffer();
- @Override
- publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{
- super.startElement(uri,localName,qName,attributes);
- if("root".equals(localName)){
- StringattrAuthor=attributes.getValue(0);
- StringattrDate=attributes.getValue(1);
- xmlHeader.append("root").append("tt");
- xmlHeader.append(attrAuthor).append("t");
- xmlHeader.append(attrDate).append("n");
- }elseif("person".equals(localName)){
- person=newPerson();
- tag=localName;
- publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
- super.characters(ch,length);
- if(null!=tag){
- Stringvalue=newString(ch,226)"> System.out.println("value="+value);
- if("id".equals(tag)){
- person.setId(newInteger(value));
- }elseif("name".equals(tag)){
- person.setName(value);
- }elseif("blog".equals(tag)){
- person.setBlog(value);
- publicvoidendElement(Stringuri,StringqName)throwsSAXException{
- if("person".equals(qName)){
- personsList.add(person);
- person=null;
- tag=null;
- super.endElement(uri,qName);
- publicvoidendDocument()throwsSAXException{
- //personsList=null;
- super.endDocument();
- }
运行结果:
4、Person类
请参见前面博客Android 创建与解析XML(二)—— Dom方式【4、Person类】
代码下载
参考推荐:
javax.xml.transform.sax
javax.xml.parsers
org.xml.sax
TransformerHandler
sax创建xml
Android 解析XML 之SAX
4、Person类
请参见前面博客Android 创建与解析XML(二)—— Dom方式【4、Person类】
代码下载
参考推荐:
javax.xml.transform.sax
javax.xml.parsers
org.xml.sax
TransformerHandler
sax创建xml
Android 解析XML 之SAX
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|