加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SAX解析xml基础

发布时间:2020-12-16 02:21:32 所属栏目:百科 来源:网络整理
导读:SAX解析xml基础 SAX解析xml基础 SAX解析原理 SAX解析的工具 核心API DefaultHandler类的使用原则 代码实现 SAX解析原理 加载一点,读取一点,处理一点,如果读取到内容你不使用的话,就没有了。 SAX解析的工具 sun公司提供的解析工具,已经内置在JDK中。 核

SAX解析xml基础


      • SAX解析xml基础
        • SAX解析原理
        • SAX解析的工具
        • 核心API
        • DefaultHandler类的使用原则
        • 代码实现

SAX解析原理


加载一点,读取一点,处理一点,如果读取到内容你不使用的话,就没有了。

SAX解析的工具


sun公司提供的解析工具,已经内置在JDK中。

核心API


在javax.xml.parsers包中的SAXparser类中存在大量的方法让我们去使用SAX解析。
* SAXparser类:用于读取和解析xml文件对象
* parse(File f,DefaultHandler dh)方法,是我们常用的解析xml的方法
* File f 参数代表将要读取的xml文件
* DefaultHandler dh 参数是SAX事件处理程序,它是SAX时间处理程序的基类,所以我们通常不会直接去new其对象,而是采用其子类去new该类的对象。
* startDocument(); //在读到文档开始时调用
* endDocument();//读到文档的结束时会调用
* startElement();//在读到开始标签时调用,属性也被在该函数的参数中传递
* endElement();//读到文档的结束标签时调用
* characters();//读到文本内容时调用的方法

DefaultHandler类的使用原则


因为DefaultHandler类是所有SAX解析程序的基类,对于这种基类,我们一般不会直接事情其构造对象,在本文的测试实例中,我们继承了DefaultHandler类,实现了自己的MyDefaultHandler类,并重写了其中的5个方法,在这5个方法中写我们自己的处理逻辑。

代码实现


  • TestSAXParser.java
package com.jpzhutech.sax;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class TestSAXParser {
    public static void main(String[] args)throws IOException{

        try {
            //创建SAXparser对象
            SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();  //用工厂拿到SAXParser的实例,因为SAXParser的构造方法是protected

            //调用开始解析xml文档
            saxParser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
        } catch (ParserConfigurationException | SAXException e) {
            throw new RuntimeException(e);
        }
    }
}
  • MyDefaultHandler.java
package com.jpzhutech.sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/** * SAX的处理程序,处理逻辑都在这个类中写 */
import org.xml.sax.helpers.DefaultHandler;

public class MyDefaultHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
        System.out.println("调用startDocument方法");
    }


    @Override
    public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {   //qName:开始标签的标签名 attributes:所有的属性都在该对象中
        System.out.println("开始标签:"+qName);

        //获取开始标签中的属性
        for(int i = 0 ; i < attributes.getLength();i++){
            String attributeName = attributes.getQName(i);
            String value = attributes.getValue(attributeName);
            System.out.println(attributeName + "=" + value);

        }
    }

    @Override
    public void endElement(String uri,String qName)
            throws SAXException {  //qName:结束标签名
        System.out.println("结束标签"+qName);
    }

    @Override
    public void characters(char[] ch,int start,int length)
            throws SAXException {  //ch:表示已经读完的所有文本内容 start:当前文本内容的开始位置 length:表示当前文本内容的长度
        String string = new String(ch,start,length);
        System.out.println("文本内容"+string);
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("结束文档");
    }

}
  • contact.xml
<?xml version="1.0" encoding="utf-8" ?>
<contactlist>
    <contact id="001" name="eric">
        <name>张三</name>
        <telephone>15338607192</telephone>
        <age>20</age>
        <email>zhangsan@qq.com</email>
        <qq>13101900</qq>
    </contact>
     <contact id="002">
        <name>李四</name>
        <telephone>15338607193</telephone>
        <age>20</age>
        <email>lisi@qq.com</email>
        <qq>13101901</qq>
    </contact>
    <contact id="003">
        <name>王五</name>
        <telephone>15338607194</telephone>
        <age>21</age>
        <email>wangwu@qq.com</email>
        <qq>13101902</qq>
    </contact>
    <ABC>
    </ABC>
</contactlist>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读