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. C 语言入门第八章--C语言预处理命令

    例如:#include ,这种以#号开头的命令称为预处理命令. ===C语言宏定义(#define的用法)==== #define 叫做宏定义命令,它也是C语言预处理命令的一种.所谓宏定义,就是用一个 ...

  2. c数据结构链式存储

    #include "stdafx.h" #include "stdio.h" #include "string.h" #include &q ...

  3. git - 节点树理解

    1.如下图 最左边黑色线是当前分支节点 每个点代表一次提交 2.当执行merge prd的时候 会把其他分支的节点都merge到你的分支同时产生右边的每条节点线. 3.每个版本都会与某条版本线上的一个 ...

  4. error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation

    遇到这个问题,请打开项目的Properties(属性)------->Configuration Properties(配置属性)------>C/C++ ------>Prepro ...

  5. IDEA工具java开发之 常用插件 git插件 追加提交 Code Review==代码评审插件 撤销提交 撤销提交 关联远程仓库 设置git 本地操作

    ◆git 插件 请先安装git for windows ,git客户端工具 平时开发中,git的使用都是用可视化界面,git命令需要不时复习,以备不时之需 1.环境准备 (1)设置git (2)本地操 ...

  6. JS操作网页中的iframe

    /* *parent.html */ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  7. php 增删改查范例(3)

    编辑页面edit.php: <?php$id=$_GET['id'];$db= new mysqli('localhost','root','root','db_0808');$sql=&quo ...

  8. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  9. HashMap1.8之节点删除分析

    HashMap之节点删除 大家一直关注的都是HashMap如何添加节点,当节点数量大于8的时候转化为红黑树,否则使用链表等等,但大家是否有看过删除节点的处理逻辑呢? 今天来看看HashMap删除节点的 ...

  10. java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2

    我们继续学习类与对象,上一篇我们定义了  坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...