SAX解析xml基础

前端之家收集整理的这篇文章主要介绍了SAX解析xml基础前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

SAX解析xml基础



SAX解析原理


加载一点,读取一点,处理一点,如果读取到内容你不使用的话,就没有了。

SAX解析的工具


sun公司提供的解析工具,已经内置在JDK中。

核心API


在javax.xml.parsers包中的SAXparser类中存在大量的方法让我们去使用SAX解析。
* SAXparser类:用于读取和解析xml文件对象
* parse(File f,DefaultHandler dh)方法,是我们常用的解析xml的方法
* File f 参数代表将要读取的xml文件
* DefaultHandler dh 参数是SAX事件处理程序,它是SAX时间处理程序的基类,所以我们通常不会直接去new其对象,而是采用其子类去new该类的对象。
* startDocument(); //在读到文档开始时调用
* endDocument();//读到文档的结束时会调用
* startElement();//在读到开始标签调用属性也被在该函数的参数中传递
* endElement();//读到文档的结束标签调用
* characters();//读到文本内容调用方法

DefaultHandler类的使用原则


因为DefaultHandler类是所有SAX解析程序的基类,对于这种基类,我们一般不会直接事情其构造对象,在本文的测试实例中,我们继承了DefaultHandler类,实现了自己的MyDefaultHandler类,并重写了其中的5个方法,在这5个方法中写我们自己的处理逻辑。

代码实现


  • TestSAXParser.java
  1. package com.jpzhutech.sax;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5.  
  6. import javax.xml.parsers.ParserConfigurationException;
  7. import javax.xml.parsers.SAXParser;
  8. import javax.xml.parsers.SAXParserFactory;
  9.  
  10. import org.xml.sax.SAXException;
  11.  
  12. public class TestSAXParser {
  13. public static void main(String[] args)throws IOException{
  14.  
  15. try {
  16. //创建SAXparser对象
  17. SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); //用工厂拿到SAXParser的实例,因为SAXParser的构造方法是protected
  18.  
  19. //调用开始解析xml文档
  20. saxParser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
  21. } catch (ParserConfigurationException | SAXException e) {
  22. throw new RuntimeException(e);
  23. }
  24. }
  25. }
  • MyDefaultHandler.java
  1. package com.jpzhutech.sax;
  2. import org.xml.sax.Attributes;
  3. import org.xml.sax.SAXException;
  4. /** * SAX的处理程序,处理逻辑都在这个类中写 */
  5. import org.xml.sax.helpers.DefaultHandler;
  6.  
  7. public class MyDefaultHandler extends DefaultHandler {
  8.  
  9. @Override
  10. public void startDocument() throws SAXException {
  11. System.out.println("调用startDocument方法");
  12. }
  13.  
  14.  
  15. @Override
  16. public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { //qName:开始标签标签名 attributes:所有的属性都在该对象中
  17. System.out.println("开始标签:"+qName);
  18.  
  19. //获取开始标签中的属性
  20. for(int i = 0 ; i < attributes.getLength();i++){
  21. String attributeName = attributes.getQName(i);
  22. String value = attributes.getValue(attributeName);
  23. System.out.println(attributeName + "=" + value);
  24.  
  25. }
  26. }
  27.  
  28. @Override
  29. public void endElement(String uri,String qName)
  30. throws SAXException { //qName:结束标签
  31. System.out.println("结束标签"+qName);
  32. }
  33.  
  34. @Override
  35. public void characters(char[] ch,int start,int length)
  36. throws SAXException { //ch:表示已经读完的所有文本内容 start:当前文本内容的开始位置 length:表示当前文本内容的长度
  37. String string = new String(ch,start,length);
  38. System.out.println("文本内容"+string);
  39. }
  40.  
  41. @Override
  42. public void endDocument() throws SAXException {
  43. System.out.println("结束文档");
  44. }
  45.  
  46. }
  • contact.xml
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <contactlist>
  3. <contact id="001" name="eric">
  4. <name>张三</name>
  5. <telephone>15338607192</telephone>
  6. <age>20</age>
  7. <email>zhangsan@qq.com</email>
  8. <qq>13101900</qq>
  9. </contact>
  10. <contact id="002">
  11. <name>李四</name>
  12. <telephone>15338607193</telephone>
  13. <age>20</age>
  14. <email>lisi@qq.com</email>
  15. <qq>13101901</qq>
  16. </contact>
  17. <contact id="003">
  18. <name>王五</name>
  19. <telephone>15338607194</telephone>
  20. <age>21</age>
  21. <email>wangwu@qq.com</email>
  22. <qq>13101902</qq>
  23. </contact>
  24. <ABC>
  25. </ABC>
  26. </contactlist>

猜你在找的XML相关文章