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. Java 模拟斗地主

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

  2. Android之Builder对话框的一些常用方式

    原文: http://blog.csdn.net/kkfdsa132/article/details/6322835 Android为我们提供几种对话框,主要有:AlertDialog.Progres ...

  3. aws-ec2-upload

    EC2上建立文件夹并开放权限 $ mkdir /home/upload$ chmod 777 /home/upload 本机文件 上传 到EC2服务器$ scp -i awsub01.pem noip ...

  4. 学习Java的书籍资料

    对于程序员来说,编程技术至关重要,然而技术的提高不是一蹴而就的,它需要时间的积累和经验的沉淀.因此本文为大家推荐Java学习的书籍,学虽容易,学好不易,且学且珍惜. 基础类.<Java从入门到精 ...

  5. Hive的存储和MapReduce处理——数据清洗

    日期:2019.11.13 博客期:115 星期三 Result文件数据说明: Ip:106.39.41.166,(城市) Date:10/Nov/2016:00:01:02 +0800,(日期) D ...

  6. .net设计模式

    1.单例模式 public sealed class Singleton { static intance=null; static readonly object padlock=new objec ...

  7. Xcode Edit Schemes

    关于本文:有关“Xcode Edit Schemes”的设置,还是有很大的学问的.由于时间关系,我一点一点的补充. 1.在开发的时候,至少将Run的Build Configuration设置为Debu ...

  8. list的三个子类的特点

  9. pip使用镜像的方法

    http://e.pypi.python.org/这个就是官网了,清华大学提供的 建议非清华大学校内的使用这个镜像: http://e.pypi.python.org/simple(这也是一个http ...

  10. hdu 1086 You can Solve a Geometry Problem too 求n条直线交点的个数

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...