6.jaxp的sax方式操作
1.sax解析的原理
(1)解析xml有两种技术 dom 和 sax
dom:
根据xml的层级结构在内存中分配一个树形结构,把xml中标签,属性,文本封装成对象
sax:
事件驱动,一行一行边读边解析(正确来说,是按照顺序,一个一个标签解析的)
(2)所使用到的类和方法(javax.xml.parsers包里面)
SAXParserFactory 抽象类
实例 newInstance() 方法得到
SAXParser 抽象类
此类的实例从 SAXParserFactory.newSAXParser()方法获得
- parse(File f,DefaultHandler dh) 执行此方法,每当获取一个标签的时候,会自动执行DefaultHandler类中的一些方法
file xml路径
DefaultHandler 事件处理器
(3)DefaultHandler(在org.xml.sax.helpers.DefaultHandler包)
当解析到开始标签的时候,自动执行 startElement(String uri, String localName, String qName, Attributes attributes)
- qName
返回标签名,输出
参数即可qName
当解析到文本的时候,自动执行 characters(char[] ch, int start, int length)
- 返回文本,输出ch即可
当解析到结束标签的时候,自定执行 endElement(String uri, String localName, String qName)
- 返回结束标签,输出qName即可
注意:一般我们会定义一个类,并重写者三个方法,这样方便我们对xml文件操作,并不是直接实例化这个然后传递过去,其中qName
表示返回的标签名
注意:sax只能查询,不能进行增删改
实例代码如下:
需求1:获取所有的xml中的所有标签和文本
xml文件
<?xml version="1.0" encoding="UTF-8"?> <persion xmlns="http://www.example.org/one" xmlns:two="http://www.example.org/two" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/one one.xsd http://www.example.org/two two.xsd"> <two:name>12</two:name> <name>张三</name> <age>180</age> </persion>
package day2; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Demo1 { public static void main(String[] args) throws Exception { //实例化解析器工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //实例化解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //调用parse方法,开始解析 saxParser.parse("src/day2/1.xml", new myHandler()); } } //自定义事件处理器 class myHandler extends DefaultHandler{ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println(qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start,length)); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println(qName); } }
需求2:按照xml格式进行输出(上面的输出我们可以知道,空格也会输出出来)
package day2; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Demo1 { public static void main(String[] args) throws Exception { //实例化解析器工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //实例化解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //调用parse方法,开始解析 saxParser.parse("src/day2/1.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+">"); } }
需求3:查询name标签的文本
package day2; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class Demo1 { public static void main(String[] args) throws Exception { //实例化解析器工厂 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); //实例化解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); //调用parse方法,开始解析 saxParser.parse("src/day2/1.xml", new myHandler()); } } //自定义事件处理器 class myHandler extends DefaultHandler{ boolean flash = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //获取到name标签 if("name".equals(qName)) { flash = true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(flash == true) { System.out.print(new String(ch,start,length)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("name".equals(qName)) { flash = false; } } }