xml的SAX解析规则
一,为什么要用它
1.1,讲解
DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。
对内存要求比较要。
缺点: 不适合读取大容量的xml文件,容易导致内存溢出。
SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。
SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*
核心的API:
SAXParser类: 用于读取和解析xml文件对象
parse(File f,
DefaultHandler dh
)方法: 解析xml文件
参数一: File:表示 读取的xml文件。
参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类
1.2,数据
<contactList> <contact id="001" name="eric"> <name>张三</name> <age>20</age> <phone>134222223333</phone> <email>zhangsan@qq.com</email> <qq>432221111</qq> </contact> <contact id="002" name="jacky"> <name>eric</name> <age>20</age> <phone>134222225555</phone> <email>lisi@qq.com</email> <qq>432222222</qq> </contact> </contactList>
二,语法
2.1,图解
2.2,案例一 (读取数据)
public class Demo1 { public static void main(String[] args) throws Exception{ //1.创建SAXParser对象 SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.调用parse方法 /** * 参数一: xml文档 * 参数二: DefaultHandler的子类 */ parser.parse(new File("./src/contact.xml"), new MyDefaultHandler()); } }
package gz.itcast.c_sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理程序(如何解析xml文档) * @author APPle * */ public class MyDefaultHandler extends DefaultHandler { /** * 开始文档时调用 */ @Override public void startDocument() throws SAXException { System.out.println("MyDefaultHandler.startDocument()"); } /** * 开始标签时调用 * @param qName: 表示开始标签的标签名 * @param attributes: 表示开始标签内包含的属性列表 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("MyDefaultHandler.startElement()-->"+qName); } /** * 结束标签时调用 * @param qName: 结束标签的标签名称 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("MyDefaultHandler.endElement()-->"+qName); } /** * 读到文本内容的时调用 * @param ch: 表示当前读完的所有文本内容 * @param start: 表示当前文本内容的开始位置 * @param length: 表示当前文本内容的长度 * char[]( 张三 20) 100 * 98 2 */ @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()"); } }
结果
MyDefaultHandler.startDocument() MyDefaultHandler.startElement()-->contactList MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name MyDefaultHandler.characters()-->张三 MyDefaultHandler.endElement()-->name MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age MyDefaultHandler.characters()-->20 MyDefaultHandler.endElement()-->age MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone MyDefaultHandler.characters()-->134222223333 MyDefaultHandler.endElement()-->phone MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email MyDefaultHandler.characters()-->zhangsan@qq.com MyDefaultHandler.endElement()-->email MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq MyDefaultHandler.characters()-->432221111 MyDefaultHandler.endElement()-->qq MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->name MyDefaultHandler.characters()-->eric MyDefaultHandler.endElement()-->name MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->age MyDefaultHandler.characters()-->20 MyDefaultHandler.endElement()-->age MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->phone MyDefaultHandler.characters()-->134222225555 MyDefaultHandler.endElement()-->phone MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->email MyDefaultHandler.characters()-->lisi@qq.com MyDefaultHandler.endElement()-->email MyDefaultHandler.characters()--> MyDefaultHandler.startElement()-->qq MyDefaultHandler.characters()-->432222222 MyDefaultHandler.endElement()-->qq MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contact MyDefaultHandler.characters()--> MyDefaultHandler.endElement()-->contactList MyDefaultHandler.endDocument()
2.3,原模原样的输出数据
package gz.itcast.c_sax; import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * 读取contact.xml文件,完整输出文档内容 * @author APPle * */ public class Demo2 { public static void main(String[] args)throws Exception { //1.创建SAXParser SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); //2.读取xml文件 MyDefaultHandler2 handler = new MyDefaultHandler2(); parser.parse(new File("./src/contact.xml"), handler); String content = handler.getContent(); System.out.println(content); } }
package gz.itcast.c_sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理器程序 * @author APPle */ public class MyDefaultHandler2 extends DefaultHandler { //存储xml文档信息 private StringBuffer sb = new StringBuffer(); //获取xml信息 public String getContent(){ return sb.toString(); } /** * 开始标签 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { sb.append("<"+qName); //判断是否有属性 if(attributes!=null){ for(int i=0;i<attributes.getLength();i++){ //得到属性名称 String attrName = attributes.getQName(i); //得到属性值 String attrValue = attributes.getValue(i); sb.append(" "+attrName+"=\""+attrValue+"\""); } } sb.append(">"); } /** * 文本内容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { //得到当前读取的文本 String content = new String(ch,start,length); sb.append(content); } /** * 结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { sb.append("</"+qName+">"); } }
结果:
<contactList> <contact id="001" name="eric"> <name>张三</name> <age>20</age> <phone>134222223333</phone> <email>zhangsan@qq.com</email> <qq>432221111</qq> </contact> <contact id="002" name="jacky"> <name>eric</name> <age>20</age> <phone>134222225555</phone> <email>lisi@qq.com</email> <qq>432222222</qq> </contact> </contactList>
2.4,案例三 使用sax解析把 xml文档封装成对象
package gz.itcast.c_sax; public class Contact { private String id; private String name; private String age; private String phone; private String email; private String qq; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } @Override public String toString() { return "Contact [age=" + age + ", email=" + email + ", id=" + id + ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]"; } }
package gz.itcast.c_sax; import java.io.File; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /** * 使用sax解析把 xml文档封装成对象 * @author APPle * */ 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); } } }
package gz.itcast.c_sax; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * SAX处理程序 * @author APPle * */ public class MyDefaultHandler3 extends DefaultHandler { //存储所有联系人对象 private List<Contact> list = new ArrayList<Contact>(); public List<Contact> getList(){ return list; } //保存一个联系人信息 private Contact contact; /** * 思路: * 1)创建Contact对象 * 2)把每个contact标签内容存入到Contact对象 * 3)把Contact对象放入List中 */ //用于临时存储当前读到的标签名 private String curTag; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { curTag = qName; //读取到contact的开始标签创建Contact对象 if("contact".equals(qName)){ contact = new Contact(); //设置id值 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; //读到contact的结束标签放入List中 if("contact".equals(qName)){ list.add(contact); } } }
Contact [age=20, email=zhangsan@qq.com, id=001, name=张三, phone=134222223333, qq=432221111] Contact [age=20, email=lisi@qq.com, id=002, name=eric, phone=134222225555, qq=432222222]
xml的SAX解析规则的更多相关文章
- xml的SAX解析和dom解析的区别
一,区别 DOM解析 SAX解析 原理: 一次性加载xml文档,不适合大容量的文件读取 原理: 加载一点,读取一点,处理一点.适合大容量文件的读取 DOM解析可以任意进行增删改成 SAX解析只能读取 ...
- XML之SAX解析模型
DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...
- 【文件处理】xml 文件 SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...
- Android解析XML之SAX解析器
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...
- xml——dom&sax解析、DTD&schema约束
dom解析实例: 优点:增删改查一些元素等东西方便 缺点:内存消耗太大,如果文档太大,可能会导致内存溢出 sax解析: 优点:内存压力小 缺点:增删改比较复杂 当我们运行的java程序需要的内存比较大 ...
- 使用jaxp对比xml进行SAX解析
package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationExcep ...
- xml的xPath解析规则
一,为什么要用xpath技术 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! 二,xpath的规则 2.1,/根元素的案例 /AAA 选择根元素AAA ...
- xml的Dom4j解析规则
一,xml的样本 <?xml version="1.0" encoding="utf-8"?> <contactList> <co ...
- JavaWeb学习笔记——XML和SAX解析区别
随机推荐
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
- 自用最小生成树模板(基于Kruskal)
200ms的板子,我尽力了,以我自己的能力没法再快了... 基于Kruskal的做法,跑了200ms,以我自己的能力没办法再快了,不过翻了几页评测列表发现我是最快的...我觉得应该会有更快的方法.想法 ...
- Azure ARM (21) Azure订阅的两种管理模式
<Windows Azure Platform 系列文章目录> 熟悉Azure平台的读者都知道,Microsoft Azure服务管理,分为三个层次: 1.企业服务合同 (Enterpri ...
- 2018/2/5 ELK技术栈之ElasticSearch学习笔记
npm config set registry https://registry.npm.taobao.org npm config get registry 支持跨域访问http.cors.enab ...
- 像我这样优雅地进行Spring整合MongoDB
本文重点是要将mongodb与spring整合到项目中去,在实践中发现问题,追踪问题,然后解决问题. 一.准备 Maven.Spring(spring-data-mongodb) spring Dat ...
- CSS常用属性计算原理
absolute: left.right/top.bottom 的百分比值分别根据父元素的 wdith / height 计算 margin: top /right / bottom/ left 的百 ...
- Windows 系统下安装 dig 命令
dig是一个Linux下用来DNS查询信息的小工具,dig全称是Domain Information Groper,与nslookup类似,但比nslookup功能更强大.Windows只有nsloo ...
- vs code 使用git
1.下载git https://git-scm.com/ 2. git 全局设置 git config --global user.name "xxxx" git config - ...
- 腾讯云微计算实践:从Serverless说起,谈谈边缘计算的未来
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:黄文俊,腾讯云高级产品经理,曾经历过企业级存储.企业级容器平台等产品的架构与开发,对容器.微服务.无服务器.DevOps等都有浓厚兴趣. ...
- Appium适配Android7.0以上版本
Appium适配Android7.0以上版本 测试机型: 华为荣耀V9 安卓版本: Android7.0 appium版本: 1.65 说明: 公司新采购了一批安卓机器,拿了其中一台华为荣耀V9跑之前 ...