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;
        }
    }
}

 

猜你喜欢

转载自www.cnblogs.com/zjdbk/p/9168916.html