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. AppBar中自定义顶部导航

    在上一篇里总结AppBar的一些简单用法,但是AppBar除了有前面那些样式属性外,还能实现类似底部的Tab切换. 首先下载并运行前面的项目: 然后在此基础上实现Tab切换. 常见属性 TabBar有 ...

  2. DAO层单元测试编码和问题排查

    DAO层单元测试编码和问题排查 SecKillDaoTest .java(注意接口参数使用注解@Parm(“parameter”)) package org.secKill.dao; import o ...

  3. docker 部署 tomcat

    1.搜索tomcat信息 docker search tomcat 2.下拉tomcat 镜像 docker pull tomcat 3.运行tomcat docker run -d --name=t ...

  4. 不缓存JS

    方法一:告诉浏览器不要缓存(不一定好使) <meta http-equiv="Pragma" content="no-cache"> <met ...

  5. 异常-打开文件过多(too many open files)

    异常-打开文件过多 异常报错如下 09-Oct-2019 15:37:51.923 严重 [http-nio2-8080-Acceptor-0] org.apache.tomcat.util.net. ...

  6. python简单的函数定义和用法实例

    python简单的函数定义和用法实例 这篇文章主要介绍了python简单的函数定义和用法,实例分析了Python自定义函数及其使用方法,具有一定参考借鉴价值,需要的朋友可以参考下 具体分析如下: 这里 ...

  7. Redis 基础及各数据类型对应的命令

    Redis 命令文档 基本概念 安装及使用 可以在官网下载源码编译安装.对于 CentOS,还可以通过 yum install redis 安装. Redis 安装完成后,通过 redis-serve ...

  8. 单例模式(Singleton Patten)

    顾名思义,单例模式就是只有一个实例,不管怎样,使用了单例模式的类在系统中只有一个对象被访问到.Java中单例模式定义:“一个类有且仅有一个实例,并且这个类会自行实例化,实例化时候的对象可以提供给整个系 ...

  9. [Linux] 016 压缩解压命令

    1. 压缩解压命令:gzip 命令名称:gzip 命令所在路径:/bin/gzip 执行权限:所有用户 语法:gzip [文件] 功能描述:压缩文件 压缩后文件的格式:.gz 补充: 解压 .rar ...

  10. dp(01背包问题)

    且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 小Ho现在手上有M张奖券,而奖品区有N件奖品,分别标号为1到N,其中第i件奖品需要need( ...