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 }


浙公网安备 33010602011771号