SAX解析

概述

XML的解析方式有两种,一种是DOM解析,另一种是SAX解析。SAX解析是边读边解析,占用的内存更少。


实现方法

 

 

 

 


解析过程

SAX解析方法是边读边解析。

当读取到一个标签的时候,自动调用startElement()方法

当读取到一个文件的时候,自动调用characters()方法

当读取到一个结束标签的时候,自动调用endElement()方法

解析事件自动执行,只需要在parse方法中传递xml路径和事件处理器即可。


利用sax方法操作XML

读取XML文件

sax方法是边读边解析,且自动调用方法。sax方法不能及逆行增删改操作,只能查询。

XML文件代码:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <person>
 3     <p1>
 4         <name>zhangsan</name>
 5         <age>18</age>
 6     </p1>
 7     <p1>
 8         <name>lisi</name>
 9         <age>20</age>
10     </p1>
11 </person>

打印出整个文档

步骤:

1.创建解析器工厂

2.创建解析器

3.执行parse方法,第一个参数是xml文件的路径,第二个参数是事件处理器

4.自己创建一个类,继承DefaultHanlder(事件处理器类),重写该类里面的三个方法

5.通过重写函数实现XML文件的打印

 1 package JaxpSax;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.xml.parsers.ParserConfigurationException;
 6 import javax.xml.parsers.SAXParser;
 7 import javax.xml.parsers.SAXParserFactory;
 8 
 9 import org.xml.sax.Attributes;
10 import org.xml.sax.SAXException;
11 import org.xml.sax.helpers.DefaultHandler;
12 
13 public class TestSax {
14 
15     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
16         /*
17          * 1.创建解析器工厂
18          * 2.创建解析器
19          * 3.执行parse方法
20          * 4.自己创建一个类,继承DefaultHanlder,重写该类里面的三个方法
21          */
22         SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
23         SAXParser saxParser=saxParserFactory.newSAXParser();
24         saxParser.parse("src/p1.xml", new MyDefault());
25     }
26 
27 }
28 
29 class MyDefault extends DefaultHandler{
30 
31     @Override
32     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
33         // TODO Auto-generated method stub
34         System.out.print("<"+qName+">");
35     }
36     @Override
37     public void characters(char[] ch, int start, int length) throws SAXException {
38         // TODO Auto-generated method stub
39         System.out.print(new String(ch,start,length));
40     }
41     @Override
42     public void endElement(String uri, String localName, String qName) throws SAXException {
43         // TODO Auto-generated method stub
44         System.out.print("</"+qName+">");
45     }
46 
47 
48     
49 }

 

 获取所有name元素的值

步骤:

1.创建解析器工厂

2.创建解析器

3.执行parse方法,第一个参数是xml文件的路径,第二个参数是事件处理器

4.自己创建一个类,继承DefaultHanlder(事件处理器类),重写该类里面的三个方法

5.通过重写函数,实现name标签的内容的读取

 1 package JaxpSax;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.xml.parsers.ParserConfigurationException;
 6 import javax.xml.parsers.SAXParser;
 7 import javax.xml.parsers.SAXParserFactory;
 8 
 9 import org.xml.sax.Attributes;
10 import org.xml.sax.SAXException;
11 import org.xml.sax.helpers.DefaultHandler;
12 
13 public class TestSax {
14 
15     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
16         /*
17          * 1.创建解析器工厂
18          * 2.创建解析器
19          * 3.执行parse方法
20          * 4.自己创建一个类,继承DefaultHanlder,重写该类里面的三个方法
21          */
22         SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
23         SAXParser saxParser=saxParserFactory.newSAXParser();
24         saxParser.parse("src/p1.xml", new MyDefault());
25     }
26 
27 }
28 
29 class MyDefault extends DefaultHandler{
30     boolean flag=false;
31     @Override
32     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
33         // TODO Auto-generated method stub
34         if(qName.equals("name"))
35         {
36             flag=true;
37         }
38     }
39     @Override
40     public void characters(char[] ch, int start, int length) throws SAXException {
41         // TODO Auto-generated method stub
42         if(flag==true)
43         {
44             System.out.println(new String(ch,start,length));
45         }
46     }
47     @Override
48     public void endElement(String uri, String localName, String qName) throws SAXException {
49         // TODO Auto-generated method stub
50         if(qName.equals("name"))
51         {
52             flag=false;
53         }
54     }
55 
56 
57     
58 }

 

posted @ 2021-02-25 09:43  _厨师沙拉  阅读(413)  评论(0)    收藏  举报