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

 

6.jaxp的sax方式操作的更多相关文章

  1. 用JAXP的SAX方式解析XML文件

    简单用JAXP的SAX方式(事件驱动)解析XML文件: 文件(1.XML) <?xml version="1.0" encoding="UTF-8" st ...

  2. jaxp的dom方式操作(查找、添加、修改、删除、遍历节点)

    package cn.itcast.jaxptest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder;imp ...

  3. XML的解析(DOM以及SAX方式)

    感谢http://blog.csdn.net/redarmy_chen/article/details/12951649(关于SAX解析)以及http://blog.csdn.net/zhangerq ...

  4. 用JAXP的dom方式解析XML文件

    用JAXP的dom方式解析XML文件,实现增删改查操作 dom方式解析XML原理 XML文件 <?xml version="1.0" encoding="UTF-8 ...

  5. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  6. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

  8. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)

    通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...

  9. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)

    通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...

随机推荐

  1. js常见的几种设计模式

    一.单例模式 单例模式也称作为单子模式,更多的也叫做单体模式.为软件设计中较为简单但是最为常用的一种设计模式. 在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的 ...

  2. 我的Podfile如下

    # Uncomment this line to define a global platform for your projectuse_frameworks!(http://www.my516.c ...

  3. CSU 1547 Rectangle(dp、01背包)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1547 Description Now ,there are some rectang ...

  4. 002-JS-SDK开发使用,网页获取授权,扫一扫调用

    一.概述 在申请响应的公众号之后,实名认证或者企业认证之后,可以进行对应开发 二.开发步骤 2.1.开发前提[服务号]-域名设置 登录后台之后→左侧设置→公众号设置→功能设置,设置好“JS接口安全域名 ...

  5. Python——GUI可视化

    import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class ...

  6. pandas melt 与pivot 函数

    (掌握这个,基本就完美无缺的任意按照自己的想法,更改列了.) 背景: 最近有个excel 数据需要转化的过程. 数据量还挺大的,大概有30多万. 需要把某些行变成列,有些列又变成行. 这个操作本身就比 ...

  7. 【ABAP系列】SAP ABAP 物料凭证增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 物料凭证增强 ...

  8. 2019/10/27 TZOJ

    1001 Gaussian Prime http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=379 ...

  9. [COCI2017.1]Deda —— 解锁线段树的新玩法

    众所周知,能用线段树做的题一定可以暴力 但考场上也只能想到暴力了,毕竟还是对线段树不熟练. deda 描述 有一辆车上有n个小孩,年龄为1~n,然后q个询问,M X A代表在第X站时年龄为A的小孩会下 ...

  10. Emqtt集群搭建

    1 Emqtt简单搭建 1.1  介绍:EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器 ...