Sax解析xml文档

测试的xml数据:

<?xml version="1.0" encoding="utf-8" ?>
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don‘t forget the meeting!</body>
</note>

新建SaxTest类继承至DefaultHandle

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.FileInputStream;
import java.io.IOException;

public class SaxTest extends DefaultHandler {
    @Override
    public void startDocument() throws SAXException {
        System.out.println("开始解析文档");
    }

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

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName);//每个标签开始都会触发该事件,attributes是标签的属性
    }

    @Override
    public void endElement(String uri, String localName, String qName) 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));//标签开始到标签结束之间的内容
    }

    static public void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
        String textXml = SaxTest.class.getResource("/").getPath() + "test.xml";
        FileInputStream inputStream = new FileInputStream(textXml);
        SAXParserFactory.newInstance().newSAXParser().parse(inputStream, new SaxTest());
    }
}

解析结果截图:

其中characters方法需要特别注意,开始标签到结束标签的内容可能不止会触发一次characters事件,也就是说标签中的内容可能会多次触发characters事件,所以如果要获取标签内的完整内容需要特别小心,一般使用StringBuilder,如下代码。

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import java.io.FileInputStream;
import java.io.IOException;

public class SaxTest extends DefaultHandler {
    StringBuilder stringBuilder = new StringBuilder();

    @Override
    public void startDocument() throws SAXException {
        System.out.println("开始解析文档");
    }

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

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName);//每个标签开始都会触发该事件,attributes是标签的属性
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println(stringBuilder.toString().trim());
        stringBuilder.delete(0, stringBuilder.length());//输出内容,并清空stringBuilder

        System.out.println(qName);//每个标签结束都会触发该事件
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        stringBuilder.append(ch, start, length);
    }

    static public void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
        String textXml = SaxTest.class.getResource("/").getPath() + "test.xml";
        FileInputStream inputStream = new FileInputStream(textXml);
        SAXParserFactory.newInstance().newSAXParser().parse(inputStream, new SaxTest());
    }
}
时间: 2024-10-28 05:53:14

Sax解析xml文档的相关文章

cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)

今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风... 恩,听着歌写文档生活就是这么享受. 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊..这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动,反正就是参加了可以抽奖这样子啦,没错,我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨,而且还都是比较罗嗦,没想到隔天cocos君竟然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈..然后就是以前的大

[Java开发之路](11)SAX解析XML文档

1. 简介 Dom解析功能强大,可增删改查,操作时会将XML文档读到内存,因此适用于小文档: SAX解析是从头到尾逐行逐个元素解析,修改较为不便,但适用于只读的大文档: SAX采用事件驱动的方式解析XML.套用网友的解释:如同在电影院看电影一样,从头到尾看一遍,不能回退(Dom可来来回回读取),在看电影的过程中,每遇到一个情节,都会调用大脑去接收处理这些信息.SAX也是相同的原理,每遇到一个元素节点,都会调用相应的方法来处理.在SAX的解析过程中,读取到文档开头.文档结尾,元素的开头和元素结尾都

编写一个属于自己的sax解析xml文档

首先需要一个xml文档 <?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>Hack36计</书名> <价格>78</价格> <作者>老死不相往来</作者> </书> <书> <书名>android高级程序设计</书名> <价格>89</价格&

Java高级特性 第14节 解析XML文档(2) - SAX 技术

一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口. 1. SAX解析原理: 加载一点,读取一点,处理一点.对内存要求比较低. SAX解析工具内置在jdk中:org.xml.sax.*

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用

Android解析XML文档的两种方式的简单对比

Android之所以会用到解析XML文档,不仅与JAVA对XML的解析比较简单,而且还因为XML是Android在网络间传递信息的主要存储方式.下面我简单谈谈Android对XML文档解析的两种方式:dom和sax.dom解析方式是,解析方法将一个XML文件看成是一棵树.由数据结构的知识我们知道对树的处理比较简单,就是对树的节点进行增,删,改,查,这也是dom的一个最大优点.但是,dom方式在解析的时候是一次性就将整个XML文档读进内存,这坏处不用我说了吧,我宝贵的内存是禁不起这么折腾的. sa

浅谈用java解析xml文档(二)

上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点! SAX(Simple API for XML),是指一种接口,或者一个软件包. 首先我们应该知道SAX解析和dom解析的区别: dom是树结构解析,易于理解和开发,它可以随意访问文件所在的节点位置,易于修改,删除和查询.但对于dom文档过大时,则会解析较慢. 而SAX解析是事件推动型,顺序读取文件的节点,且只能读取文档的内容,不能对文档的内容进行修噶,对文档的大小没有过多的限制,但开大复杂度较高,

艺多不压身 -- 四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX: JDOM: DOM4J: 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.