SAX解析XML文档

不念不忘少年蓝@ 2022-06-17 00:38 342阅读 0赞

1、简介

前面我们介绍过利用DOM解析XML文档,Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档;SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档。

SAX采用事件驱动的方式解析XML。套用别人的解释,如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息。SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理。在SAX的解析过程中,读取到文档开头、文档结尾,元素的开头和元素结尾都会调用相应方法,我们可以在这些方法中进行相应事件处理。

2、解析步骤

(1)通过SAXParserFactory的静态方法newInstance()方法获取SAXParserFactory实例对象factory

  1. SAXParserFactory factory = SAXParserFactory.newInstance();

(2)通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser

  1. SAXParser parser = factory.newSAXParser();

(3)创建一个类继承DefaultHandler,重写其中的一些方法进行业务处理

  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;
  4. public class SAXParserHandler extends DefaultHandler{
  5. // 用来标示解析开始
  6. @Override
  7. public void startDocument() throws SAXException {
  8. }
  9. // 用来标示解析结束
  10. @Override
  11. public void endDocument() throws SAXException {
  12. }
  13. // 用来遍历XML文件的开始标签
  14. @Override
  15. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  16. super.startElement(uri, localName, qName, attributes);
  17. }
  18. // 用来遍历XML文件的结束标签
  19. @Override
  20. public void endElement(String uri, String localName, String qName) throws SAXException {
  21. super.endElement(uri, localName, qName);
  22. }
  23. // 处理在XML文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容
  24. @Override
  25. public void characters(char[] ch, int start, int length) throws SAXException {
  26. super.characters(ch, start, length);
  27. }
  28. }

(4)创建Handler类对象实例

  1. // 定义SAXParserHandler对象
  2. SAXParserHandler handler = new SAXParserHandler();

(5)解析XML文档

  1. saxParser.parse(path, handler);

3、解析实例

  1. import org.xml.sax.Attributes;
  2. import org.xml.sax.SAXException;
  3. import org.xml.sax.helpers.DefaultHandler;
  4. import javax.xml.parsers.ParserConfigurationException;
  5. import javax.xml.parsers.SAXParser;
  6. import javax.xml.parsers.SAXParserFactory;
  7. import java.io.IOException;
  8. /** * Created by xxx on 2017/3/30. */
  9. public class SaxParserXmlCode extends DefaultHandler {
  10. private int bookIndex = 0;
  11. private String currentTag = null;
  12. // 用来标示解析开始
  13. @Override
  14. public void startDocument() throws SAXException {
  15. System.out.println("SAX解析开始...");
  16. }
  17. // 用来标示解析结束
  18. @Override
  19. public void endDocument() throws SAXException {
  20. System.out.println("SAX解析结束...");
  21. }
  22. // 用来遍历XML文件的开始标签
  23. @Override
  24. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  25. // 调用DefaultHandler类的startElement方法
  26. super.startElement(uri, localName, qName, attributes);
  27. currentTag = qName;
  28. // 开始解析book元素节点
  29. if(qName.equals("book")){
  30. ++ bookIndex;
  31. System.out.println("开始解析第" + bookIndex + "个节点...");
  32. // 已知book元素节点下的属性名称,根据属性名称获取属性值
  33. /*String value = attributes.getValue("category"); System.out.println("value->"+value);*/
  34. // 不知道book元素节点下的属性名称以及个数
  35. int size = attributes.getLength();
  36. for(int i = 0;i < size; ++i){
  37. System.out.println(attributes.getQName(i) + ":" + attributes.getValue(i));
  38. }
  39. }else if(!qName.equals("bookstore")){
  40. System.out.print(qName + ":");
  41. }
  42. }
  43. // 用来遍历XML文件的结束标签
  44. @Override
  45. public void endElement(String uri, String localName, String qName) throws SAXException {
  46. super.endElement(uri, localName, qName);
  47. // 判断一个节点是否解析完
  48. if(qName.equals("book")){
  49. System.out.println("结束解析第" + bookIndex + "个节点...");
  50. }
  51. }
  52. @Override
  53. public void characters(char[] ch, int start, int length) throws SAXException {
  54. super.characters(ch, start, length);
  55. String text = new String(ch, start, length);
  56. if(!text.trim().equals("")){
  57. System.out.println(text);
  58. }
  59. if("title".equals(currentTag)) {
  60. System.out.println("title=======" + text);
  61. }else if("price".equalsIgnoreCase(currentTag)){
  62. System.out.println("price=======" + text);
  63. }
  64. currentTag = null;
  65. }
  66. public static void main(String[] args) {
  67. String path = "F:\\datafortag\\book.xml";
  68. try {
  69. // 通过SAXParserFactory的静态方法newInstance()方法获取SAXParserFactory实例对象factory
  70. SAXParserFactory factory = SAXParserFactory.newInstance();
  71. // 通过SAXParserFactory实例的newSAXParser()方法返回SAXParser实例parser
  72. SAXParser saxParser = factory.newSAXParser();
  73. // 定义SAXParserHandler对象
  74. SaxParserXmlCode handler = new SaxParserXmlCode();
  75. // 解析XML文档
  76. saxParser.parse(path, handler);
  77. } catch (ParserConfigurationException e) {
  78. e.printStackTrace();
  79. } catch (SAXException e) {
  80. e.printStackTrace();
  81. } catch (IOException e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. }

附book.xml

  1. <?xml version="1.0" encoding="utf-8"?><bookstore>
  2. <book category="Java">
  3. <title lang="chi">Java编程思想</title>
  4. <author>Bruce Eckel</author>
  5. <year>2007</year>
  6. <price>108.00</price>
  7. </book>
  8. <book category="C++">
  9. <title lang="en">Effective C++</title>
  10. <author>Scott Meyers</author>
  11. <year>2006</year>
  12. <price>58.00</price>
  13. </book>
  14. </bookstore>

发表评论

表情:
评论列表 (有 0 条评论,342人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SAX解析XML

    *下面是SAX解析XML的示例,包括三个文件employee.xml、Employee.java、SaxEmployee.java** **1.被解析的employee...

    相关 SAX解析XML

    SAX(Simple API for XML)也是一种解析 XML 文件的方法,它虽然不是官方标准,但它是 XML 的事实标准,大部分 XML 解析器都支持它。 SAX 与

    相关 Java SAX 解析 XML

    与 DOM 建立树形结构的方式不同,SAX 采用事件模型来解析 XML 文档,是解析 XML 文档的一种更快速、更轻量的方法。 利用 SAX 可以对 XML 文档进行有选择的

    相关 SAX解析XML文档

    1、简介 前面我们介绍过利用DOM解析XML文档,Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档;SAX解析是从头到尾逐行逐个元素解析,修改较

    相关 SAX解析XML

    SAX(Simple API for XML)也是一种解析 XML 文件的方法,它虽然不是官方标准,但它是 XML 的事实标准,大部分 XML 解析器都支持它。 SAX ...