XML系列:(9)JAXP的SAX解析方式读取XML

前端之家收集整理的这篇文章主要介绍了XML系列:(9)JAXP的SAX解析方式读取XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*






SAX核心的API:

SAXParser类: 用于读取和解析xml文件对象

parse(File f,DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

DefaultHandler类的API:

void startDocument() : 在读到文档开始时调用

void endDocument() :在读到文档结束时调用

void startElement(String uri,String localName,String qName,Attributes attributes) :读到开始标签调用

void endElement(String uri,String qName) :读到结束标签调用

void characters(char[] ch,int start,int length) : 读到文本内容调用

  1. //1.创建SAXParser对象
  2. SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
  3. //2.调用parse方法
  4. parser.parse(newFile("./src/contact.xml"),newMyDefaultHandler());


1、读取XML


1.1、展示DefaultHandler的各个事件处理函数

Demo01.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importjava.io.File;
  4.  
  5. importjavax.xml.parsers.SAXParserFactory;
  6. importjavax.xml.parsers.SAXParser;
  7.  
  8. /**
  9. *第一个SAX读取xml文件程序
  10. *@authorRK
  11. *
  12. */
  13. publicclassDemo01
  14. {
  15. publicstaticvoidmain(String[]args)throwsException
  16. {
  17. //1.创建SAXParserFactory工厂
  18. SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
  19. //2.创建SAXParser对象
  20. SAXParserparser=parserFactory.newSAXParser();
  21. //3.调用parse方法
  22. /**
  23. *参数一:xml文档
  24. *参数二:DefaultHandler的子类
  25. */
  26. parser.parse(newFile("./src/animals.xml"),newMyDefaultHandler01());
  27. System.out.println("执行结束!");
  28. }
  29. }


MyDefaultHandler01.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importorg.xml.sax.Attributes;
  4. importorg.xml.sax.SAXException;
  5. importorg.xml.sax.helpers.DefaultHandler;
  6.  
  7. /**
  8. *SAX处理程序(如何解析xml文档)
  9. *@authorRK
  10. *
  11. */
  12. publicclassMyDefaultHandler01extendsDefaultHandler
  13. {
  14.  
  15. /**
  16. *开始文档时调用
  17. */
  18. @Override
  19. publicvoidstartDocument()throwsSAXException
  20. {
  21. System.out.println("MyDefaultHandler.startDocument()");
  22. }
  23.  
  24. /**
  25. *结束文档时调用
  26. */
  27. @Override
  28. publicvoidendDocument()throwsSAXException
  29. {
  30. System.out.println("MyDefaultHandler.endDocument()");
  31. }
  32.  
  33. /**
  34. *开始标签调用
  35. *@paramqName:表示开始标签标签
  36. *@paramattributes:表示开始标签内包含的属性列表
  37. */
  38. @Override
  39. publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException
  40. {
  41. System.out.println("MyDefaultHandler.startElement()==>"+qName);
  42. }
  43.  
  44. /**
  45. *结束标签调用
  46. *@paramqName:结束标签标签名称
  47. */
  48. @Override
  49. publicvoidendElement(Stringuri,StringqName)throwsSAXException
  50. {
  51. System.out.println("MyDefaultHandler.endElement()==>"+qName);
  52. }
  53.  
  54. /**
  55. *读到文本内容的时调用
  56. *@paramch:表示当前读完的所有文本内容
  57. *@paramstart:表示当前文本内容的开始位置
  58. *@paramlength:表示当前文本内容的长度
  59. */
  60. @Override
  61. publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException
  62. {
  63. //得到当前文本内容
  64. Stringcontent=newString(ch,start,length);
  65. System.out.println("MyDefaultHandler.characters()==>"+content+"==>End");
  66. }
  67.  
  68. }



1.2、将XML重新输出的示例

Demo02.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importjava.io.File;
  4.  
  5. importjavax.xml.parsers.SAXParserFactory;
  6. importjavax.xml.parsers.SAXParser;
  7.  
  8. publicclassDemo02
  9. {
  10. publicstaticvoidmain(String[]args)throwsException
  11. {
  12. //1.创建SAXParserFactory工厂
  13. SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
  14. //2.创建SAXParser对象
  15. SAXParserparser=parserFactory.newSAXParser();
  16. //3.创建Handler对象,并调用parse方法
  17. MyDefaultHandler02handler=newMyDefaultHandler02();
  18. parser.parse(newFile("./src/animals.xml"),handler);
  19. //4.结果输出
  20. Stringcontent=handler.getContent();
  21. System.out.println(content);
  22. }
  23. }

MyDefaultHandler02.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importorg.xml.sax.Attributes;
  4. importorg.xml.sax.SAXException;
  5. importorg.xml.sax.helpers.DefaultHandler;
  6.  
  7. /**
  8. *SAX处理器程序
  9. *@authorRK
  10. *
  11. */
  12. publicclassMyDefaultHandler02extendsDefaultHandler
  13. {
  14. //存储xml文档信息
  15. privateStringBuildersb=newStringBuilder();
  16. //获取xml信息
  17. publicStringgetContent()
  18. {
  19. returnsb.toString();
  20. }
  21.  
  22. /**
  23. *开始标签
  24. */
  25. @Override
  26. publicvoidstartElement(Stringuri,Attributesattributes)throwsSAXException
  27. {
  28. sb.append("<"+qName);
  29. //判断是否有属性
  30. if(attributes!=null)
  31. {
  32. for(inti=0;i<attributes.getLength();i++)
  33. {
  34. //得到属性名称
  35. StringattrName=attributes.getQName(i);
  36. //得到属性
  37. StringattrValue=attributes.getValue(i);
  38. sb.append(""+attrName+"=\""+attrValue+"\"");
  39. }
  40. }
  41. sb.append(">");
  42. }
  43.  
  44. /**
  45. *结束标签
  46. */
  47. @Override
  48. publicvoidendElement(Stringuri,StringqName)throwsSAXException
  49. {
  50. sb.append("</"+qName+">");
  51. }
  52.  
  53. /**
  54. *文本内容
  55. */
  56. @Override
  57. publicvoidcharacters(char[]ch,intlength)throwsSAXException
  58. {
  59. //得到当前读取的文本
  60. Stringcontent=newString(ch,length);
  61. sb.append(content);
  62. }
  63.  
  64. }



1.3、更进一步深入:XMLReader和ContentHandler

Demo03.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importjavax.xml.parsers.SAXParserFactory;
  4. importjavax.xml.parsers.SAXParser;
  5. importorg.xml.sax.XMLReader;
  6.  
  7. publicclassDemo03
  8. {
  9. publicstaticvoidmain(String[]args)throwsException
  10. {
  11. SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
  12. SAXParserparser=parserFactory.newSAXParser();
  13. XMLReaderreader=parser.getXMLReader();
  14. reader.setContentHandler(newMyContentHandler03());
  15. reader.parse("./src/animals.xml");
  16. }
  17. }

MyContentHandler03.java

  1. packagecom.rk.xml.j_sax;
  2.  
  3. importorg.xml.sax.Attributes;
  4. importorg.xml.sax.ContentHandler;
  5. importorg.xml.sax.Locator;
  6. importorg.xml.sax.SAXException;
  7.  
  8. publicclassMyContentHandler03implementsContentHandler
  9. {
  10.  
  11. @Override
  12. publicvoidsetDocumentLocator(Locatorlocator)
  13. {
  14. System.out.println("MyContentHandler03.setDocumentLocator()");
  15. }
  16.  
  17. @Override
  18. publicvoidstartDocument()throwsSAXException
  19. {
  20. System.out.println("MyContentHandler03.startDocument()"+"文档开始");
  21.  
  22. }
  23.  
  24. @Override
  25. publicvoidendDocument()throwsSAXException
  26. {
  27. System.out.println("MyContentHandler03.endDocument()"+"文档结束");
  28. }
  29.  
  30. @Override
  31. publicvoidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXException
  32. {
  33. System.out.println("MyContentHandler03.startPrefixMapping()");
  34. }
  35.  
  36. @Override
  37. publicvoidendPrefixMapping(Stringprefix)throwsSAXException
  38. {
  39. System.out.println("MyContentHandler03.endPrefixMapping()");
  40. }
  41.  
  42. @Override
  43. publicvoidstartElement(Stringuri,Attributesatts)throwsSAXException
  44. {
  45. System.out.println("MyContentHandler03.startElement()"+"==>StartELement:"+qName);
  46. }
  47.  
  48. @Override
  49. publicvoidendElement(Stringuri,StringqName)throwsSAXException
  50. {
  51. System.out.println("MyContentHandler03.endElement()"+"==>EndElement:"+qName);
  52. }
  53.  
  54. @Override
  55. publicvoidcharacters(char[]ch,intlength)throwsSAXException
  56. {
  57. Stringcontent=newString(ch,length);
  58. System.out.println("MyContentHandler03.characters()"+"==>characters:"+content);
  59. }
  60.  
  61. @Override
  62. publicvoidignorableWhitespace(char[]ch,intlength)throwsSAXException
  63. {
  64. System.out.println("MyContentHandler03.ignorableWhitespace()");
  65. }
  66.  
  67. @Override
  68. publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException
  69. {
  70. System.out.println("MyContentHandler03.processingInstruction()");
  71. }
  72.  
  73. @Override
  74. publicvoidskippedEntity(Stringname)throwsSAXException
  75. {
  76. System.out.println("MyContentHandler03.skippedEntity()");
  77. }
  78.  
  79. }



以JAXP读取XML的DOM解析方法和SAX解析方法经常进行对比,如下图:

wKioL1c3CAvh-1NOAABFAK--oUE558.png

DOM解析模型如下:

wKiom1c3B2rDSxJjAABPNNYwMEA596.jpg

SAX解析模型如下:

wKioL1c3CGWy6iMzAABeoQklS-U615.jpg



2、思维导图

wKiom1c3BuKj2Z4IAAHGMNgO1_Y609.png

猜你在找的XML相关文章