SAX解析

回顾DOM解析

DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。

缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

SAX解析工具

SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

核心的API:

SAXParser类: 用于读取和解析xml文件对象

parse(File f, DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件。

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

例如:

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.DefaultHandler; public class Demo1 extends DefaultHandler {
public static void main(String[] args) {
//创建SAXParser对象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
//调用parse方法
parser.parse(new File("./src/contact.xml"), new Demo2());
}
}

[一个类继承class 类名(extends DefaultHandler)  在调用是创建传进去

DefaultHandler类的API:

void startDocument()  :  在读到文档开始时调用

void endDocument()  :在读到文档结束时调用

void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用

void endElement(String uri, String localName, String qName)   :读到结束标签时调用

void characters(char[] ch, int start, int length)  : 读到文本内容时调用

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class Demo2 extends DefaultHandler { @Override
public void startDocument() throws SAXException {
System.out.println("MyDefaultHandler.startDocument()");
} @Override
public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
} @Override
public void endElement(String uri, String localName, String qName)throws SAXException {
System.out.println("MyDefaultHandler.endElement()-->"+qName);
} @Override
public void characters(char[] ch, int start, int length)throws SAXException {String content = new String(ch,start,length);
System.out.println("MyDefaultHandler.characters()-->"+content);
} @Override
public void endDocument() throws SAXException {
System.out.println("MyDefaultHandler.endDocument()");
}
}

DOM解析

SAX解析

原理:一次性加载xml文档,不适合大容量的文件读取

原理:加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

把xml封装为对象

import java.io.File;
import java.util.List; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; public class Demo3 { public static void main(String[] args)throws Exception {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
MyDefaultHandler3 handler = new MyDefaultHandler3();
parser.parse(new File("./src/contact.xml"), handler);
List<Contact> list = handler.getList();
for (Contact contact : list) {
System.out.println(contact);
}
}
}
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class MyDefaultHandler3 extends DefaultHandler { private List<Contact> list = new ArrayList<Contact>();
public List<Contact> getList(){
return list;
}
private Contact contact; private String curTag; @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
curTag = qName;
if("contact".equals(qName)){
contact = new Contact(); contact.setId(attributes.getValue("id"));
}
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String content = new String(ch,start,length); if("name".equals(curTag)){
contact.setName(content);
} if("age".equals(curTag)){
contact.setAge(content);
} if("phone".equals(curTag)){
contact.setPhone(content);
} if("email".equals(curTag)){
contact.setEmail(content);
} if("qq".equals(curTag)){
contact.setQq(content);
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
curTag = null;
if("contact".equals(qName)){
list.add(contact);
}
}
}

总结:

1)Dom4j修改xml文档:new XMLWrier();

2)xPath技术: 快速查询xml节点selectNodes()、selectSinglNode();、xpath表达式语言

3)  SAX解析: SAXParser parse、parser()、

         DefaultHandler类:startElement();、characters();、endElement();

Day 28:SAX解析原理的更多相关文章

  1. SAX解析原理示意

    SAX解析原理示意

  2. sax解析原理与案例

    package itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExceptio ...

  3. SAX解析示例代码和原理

    import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; ...

  4. XML.03-DOM和SAX解析

    body,td { font-family: calibri; font-size: 10pt } XML.03-DOM和SAX解析 XML的DOM解析 解析 处理 回写 XML的SAX解析 SAX和 ...

  5. xml的SAX解析和dom解析的区别

    一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...

  6. xml的SAX解析规则

    一,为什么要用它 1.1,讲解 DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树. 对内存要求比较要. 缺点: 不适合读取大容量的xml文件,容易导致内存溢出. SAX ...

  7. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  8. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  9. java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)

    本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义    2.XML的解析方式    3.xml的解析工具    4.XML的解析原理    5.实例    6 ...

随机推荐

  1. J.K.罗琳女士---《失败的好处和想象的重要性》

    目录 sohu ruanyifeng web sohu http://www.sohu.com/a/166181502_467718 <哈利波特>的作者J.K.罗琳女士在出席一次哈佛大学的 ...

  2. Java 模拟斗地主

    模拟斗地主 public class M1 { public static void main(String args[]) { DouDiZhu02(); } private static void ...

  3. Linux命令:sed命令

    sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏 ...

  4. 理解JS中的回调(Callback)函数

    今天写代码时写了一个函数,想实现Nodejs查询pgSQL的数据查出来并把结果作为返回值,结果发现拿不到这个值,查了下资料才恍然大悟,这是Nodejs的最大特性--非阻塞! 查询数据操作作为比较消耗资 ...

  5. Python 基础之if if else

    1.代码块 以冒号作为开始,用缩进来划分区域,这个整体叫做代码块 if 5 == 5:   print(1)   print(2)   if True:   print(3)   print(4)   ...

  6. python 中的 *args 和 **kwargs

    在阅读Python代码时,经常会看到如下函数的定义: def fun(*args, **kwargs): 很多同学可能会对此感到困惑,这个 * args和 **kwargs是什么东西.为啥会在源码中应 ...

  7. USACO 2019 December Contest 随记

    Forewords 今年 USACO 的比赛变化挺大的,有部分分了,而且不再是固定十个点了(部分分只说这几个点满足这几个性质,以为十个点的我还高兴了一会,一提交,...),除此之外居然赛后还排名了.这 ...

  8. 子组件props接受父组件传递的值 能修改吗?

    vue2.0 子组件props接受父组件传递的值,能不能修改的问题整理 父组件代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  9. swift简介(东拼西凑,看看就的了)

    OpenStack Object Storage(Swift)架构.原理及特性 https://yq.aliyun.com/articles/50262 原文 摘要: 简介 OpenStack Obj ...

  10. java并发(二):初探syncronized

    参考博客 Java多线程系列--"基础篇"04之 synchronized关键字 synchronized基本规则 第一条 当线程访问A对象的synchronized方法和同步块的 ...