上篇对采用jaxp解析器使用dom技术解析xml做了一个介绍,对jaxp解析器使用sax技术解析xml则一笔带过了,接下来我们看看jaxp采用sax技术是如何解析xml的呢。
采用sax技术解析xml是依靠于事件驱动的,边读边解析,相关类位于javax.xml.parsers包里面
**SAXParser 此类的实例可以从SAXParserFactory的newSAXParser( )方法获得
|_ Parser( File f , DefaultHandler dh ) 两个参数 *第一个参数:xml的路径 *第二个参数:事件处理器
**SAXParserFactory 其实例可以通过本身的newInstance()方法得到
**SAX执行过程
|- 当解析到开始标签的时,自动执行startElement()方法
|- 当解析到文本的时,自动执行characters()方法
|_ 当解析到结束标签时,自动执行endElement()方法
**使用jaxp的sax方式来解析xml
*sax方式不能实现增删改操作,只能做查询操作
*打印整个xml文档
执行parse()方法,第一个参数是xml路径,第二个参数是事件处理器
**创建一个类,继承事件处理器的类
**重写里面的三个方法
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、创建解析器工厂 * 2、根据工厂得到解析器 * 3、调用解析器的parse方法 * 4、创建继承事件处理器的类 */ //1、创建解析器工厂 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根据工厂得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、调用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler()); }}class MyHandler extends DefaultHandler{ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.print("<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.print(new String(ch,start,length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.print("</"+qName+">"); } }
*获取到所有name的值
**定义一个成员变量flag=false
**判断开始方法是否是name元素,如果是name元素,把flag设置为true
**如果flag值为true,在character()方法里面打印内容
**当执行到结束方法时,把flag值设置成false
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、创建解析器工厂 * 2、根据工厂得到解析器 * 3、调用解析器的parse方法 * 4、创建继承事件处理器的类 */ //1、创建解析器工厂 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根据工厂得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、调用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler1()); }}class MyHandler1 extends DefaultHandler{ boolean flag=false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("name".equals(qName)){ flag=true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==true){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)){ flag=false; } }}
*获取到第一个name的值
public class TestSax { public static void main(String[] args) throws Exception { /* * 1、创建解析器工厂 * 2、根据工厂得到解析器 * 3、调用解析器的parse方法 * 4、创建继承事件处理器的类 */ //1、创建解析器工厂 SAXParserFactory saxParserFactory=SAXParserFactory.newInstance(); //2、根据工厂得到解析器 SAXParser saxParser=saxParserFactory.newSAXParser(); //3、调用解析器的parse方法 saxParser.parse("src/persion.xml", new MyHandler1()); }}class MyHandler1 extends DefaultHandler{ boolean flag=false; int idx=1; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("name".equals(qName)&&idx==1){ flag=true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flag==true){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)){ flag=false; idx++; } }}