加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML解析SAX

发布时间:2020-12-16 00:16:40 所属栏目:百科 来源:网络整理
导读:1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,

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

[java] view plain copy print ?
  1. /**Sax方式,创建XML*/
  2. publicStringsaxCreateXML(){
  3. StringWriterxmlWriter=newStringWriter();
  4. Person[]persons=newPerson[3];//创建节点Person对象
  5. persons[0]=newPerson(1,"sunboy_2050","http://blog.csdn.net/sunboy_2050");
  6. 1]=newPerson(2,"baidu","http://www.baidu.com");
  7. 2]=newPerson(3,"google","http://www.google.com");
  8. try{
  9. SAXTransformerFactoryfactory=(SAXTransformerFactory)SAXTransformerFactory.newInstance();
  10. TransformerHandlerhandler=factory.newTransformerHandler();
  11. Transformertransformer=handler.getTransformer();//设置xml属性
  12. transformer.setOutputProperty(OutputKeys.INDENT,"yes");
  13. transformer.setOutputProperty(OutputKeys.ENCODING,"utf-8");
  14. transformer.setOutputProperty(OutputKeys.VERSION,"1.0");
  15. StreamResultresult=newStreamResult(xmlWriter);//保存创建的xml
  16. handler.setResult(result);
  17. handler.startDocument();
  18. AttributesImplattr=newAttributesImpl();
  19. attr.clear();
  20. attr.addAttribute("","","author","homer");
  21. "date","2012-04-27");
  22. handler.startElement("","root",attr);
  23. intpersonsLen=persons.length;
  24. for(inti=0;i<personsLen;i++){
  25. attr.clear();
  26. "person",attr);
  27. "id",226)"> Stringid=persons[i].getId()+"";
  28. handler.characters(id.toCharArray(),0,id.length());
  29. handler.endElement("","id");
  30. "name",226)"> Stringname=persons[i].getName();
  31. handler.characters(name.toCharArray(),name.length());
  32. "name");
  33. "blog",226)"> Stringblog=persons[i].getBlog();
  34. handler.characters(blog.toCharArray(),blog.length());
  35. "blog");
  36. "person");
  37. }
  38. "root");
  39. handler.endDocument();
  40. }catch(TransformerFactoryConfigurationErrore){//SAXTransformerFactory.newInstance
  41. e.printStackTrace();
  42. }catch(TransformerConfigurationExceptione){//factory.newTransformerHandler
  43. }catch(IllegalArgumentExceptione){//transformer.setOutputProperty
  44. }catch(SAXExceptione){//handler.startDocument
  45. }catch(Exceptione){
  46. }
  47. savedXML(fileName,xmlWriter.toString());
  48. returnxmlWriter.toString();
  49. }

运行结果:





3、Sax解析XML

Code

?
    /**Sax方式,解析XML*/
  1. publicStringsaxResolveXML(){
  2. InputStreamis=readXML(fileName);
  3. SAXParserFactoryfactory=SAXParserFactory.newInstance();
  4. SAXParsersaxParser=factory.newSAXParser();
  5. PersonHandlerhandler=newPersonHandler();//person处理Handler
  6. saxParser.parse(is,handler);//handler解析xml
  7. //获取解析的xml
  8. StringxmlHeader=handler.getXMLHeader();
  9. xmlWriter.append(xmlHeader);
  10. List<Person>personsList=handler.getPersons();
  11. intpersonsLen=personsList.size();
  12. xmlWriter.append(personsList.get(i).toString()).append("n");
  13. }catch(FactoryConfigurationErrore){//SAXParserFactory.newInstance
  14. }catch(ParserConfigurationExceptione){//factory.newSAXParser
  15. //saxParser.parse
  16. }catch(IOExceptione){ returnxmlWriter.toString();
  17. /**Handler处理类*/
  18. privatefinalclassPersonHandlerextendsDefaultHandler{
  19. privateList<Person>personsList=null;//保存person
  20. privatePersonperson=null;
  21. privateStringBufferxmlHeader;//保存xml头部信息
  22. privateStringtag=null;//xmlElement
  23. /**返回解析的xml头部信息*/
  24. publicStringgetXMLHeader(){
  25. returnxmlHeader.toString();
  26. /**返回解析的Person实例数组*/
  27. publicList<Person>getPersons(){
  28. returnpersonsList;
  29. @Override
  30. publicvoidstartDocument()throwsSAXException{
  31. super.startDocument();
  32. personsList=newArrayList<Person>();
  33. xmlHeader=newStringBuffer();
  34. @Override
  35. publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException{
  36. super.startElement(uri,localName,qName,attributes);
  37. if("root".equals(localName)){
  38. StringattrAuthor=attributes.getValue(0);
  39. StringattrDate=attributes.getValue(1);
  40. xmlHeader.append("root").append("tt");
  41. xmlHeader.append(attrAuthor).append("t");
  42. xmlHeader.append(attrDate).append("n");
  43. }elseif("person".equals(localName)){
  44. person=newPerson();
  45. tag=localName;
  46. publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{
  47. super.characters(ch,length);
  48. if(null!=tag){
  49. Stringvalue=newString(ch,226)"> System.out.println("value="+value);
  50. if("id".equals(tag)){
  51. person.setId(newInteger(value));
  52. }elseif("name".equals(tag)){
  53. person.setName(value);
  54. }elseif("blog".equals(tag)){
  55. person.setBlog(value);
  56. publicvoidendElement(Stringuri,StringqName)throwsSAXException{
  57. if("person".equals(qName)){
  58. personsList.add(person);
  59. person=null;
  60. tag=null;
  61. super.endElement(uri,qName);
  62. publicvoidendDocument()throwsSAXException{
  63. //personsList=null;
  64. super.endDocument();
  65. }

运行结果:





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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读