【Java】XML解析之SAX
SAX介绍
SAX(Simple API for XML)是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具有速度快,内存占用上的优点。
XML生成
代码如下:
package com.test.sax; import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult; import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl; public class TestCreateXml { public static void main(String[] args) {
//创建SAXTransformerFactory实例
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
try {
//创建TransformerHandler实例
TransformerHandler handler = factory.newTransformerHandler();
//创建Transformer实例
Transformer transformer = handler.getTransformer();
//设置输出的xml属性,encoding为编码,
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//indent是确保输出的xml文件能够自动换行
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //创建Result对象,将Result对象加载到TransHandler中
// 注意:1、这一步必须在Transformer.setOutputProperty()之后,不然设置的xml属性将不生效
// 2、这一步也必须在TransformerHandler.startDocument()之前,不然会报错。
// 分析源码后发现,startDocument()会先判断result是否为空,为空则报错
Result result = new StreamResult("src/test-sax-create.xml");
handler.setResult(result); // 创建属性Attribute对象
AttributesImpl attr = new AttributesImpl();
//开始写文件
handler.startDocument();
//写入根节点conpany
handler.startElement("", "", "conpany", attr); //清空属性,
attr.clear();
//设置属性
attr.addAttribute( "", "", "name", "", "1");
//写入根节点的子节点book
handler.startElement("", "", "department", attr); attr.clear();
//分别写入book节点的子节点
attr.addAttribute( "", "", "name", "", "employee1");
attr.addAttribute( "", "", "id", "", "1");
handler.startElement("", "", "employee", attr);
//写入子节点内容
handler.characters("123".toCharArray(), 0, "123".toCharArray().length);
//写入子节点末尾
handler.endElement("", "", "employee");
//写入department节点末尾
handler.endElement("", "", "department");
//写入根节点末尾
handler.endElement("", "", "conpany");
//写文件结束
handler.endDocument();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
生成文件如下:

XML解析
代码如下:
package com.test.sax; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.xml.parsers.ParserConfigurationException;
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 TestParseXml { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
//创建SAXTransformerFactory实例
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//创建TransformerHandler实例
SAXParser saxParser = saxParserFactory.newSAXParser(); MyHandler myHandler = new MyHandler(); saxParser.parse(TestParseXml.class.getClassLoader().getResourceAsStream("test.xml"), myHandler);
} } class MyHandler extends DefaultHandler{ /**
* 开始解析文档时,调用的方法
*/
@Override
public void startDocument() throws SAXException {
System.out.println("---------startDocument-------");
} /**
* 文档解析完结时,调用的方法
*/
@Override
public void endDocument() throws SAXException {
System.out.println("---------endDocument-------");
super.endDocument();
} /**
* 开始解析每个元素时,调用的方法,会重复调用
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //qName 元素标签
System.out.println("---------startElement-------" + qName); // 处理属性
if(attributes != null )
{
for (int i = 0; i < attributes.getLength(); ++i)
{
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(i);
System.out.print("\t "+ attrName + "=" + attrValue);
}
}
System.out.println("");
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("---------endElement-------" + qName);
} /**
* 解析到每个元素的内容时会调用此方法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String content = new String(ch,start,length);
System.out.println("---------characters-------" + "content == "+ content);
}
}
控制台输出:
---------startDocument-------
---------startElement-------conpany
name=hd
---------characters-------content == ---------startElement-------department
name=department1
---------characters-------content == ---------startElement-------employee
name=employee1 id=1
---------characters-------content == 123
---------endElement-------employee
---------characters-------content == ---------endElement-------department
---------characters-------content == ---------startElement-------department
name=department2
---------characters-------content == ---------startElement-------employee
name=employee2 id=2
---------characters-------content == 321
---------endElement-------employee
---------characters-------content == ---------startElement-------employee
name=employee3 id=3
---------endElement-------employee
---------characters-------content == ---------endElement-------department
---------characters-------content == ---------startElement-------department
name=department3
---------characters-------content == ---------endElement-------department
---------characters-------content == ---------endElement-------conpany
---------endDocument-------
Simple API for XML
【Java】XML解析之SAX的更多相关文章
- Java XML解析工具 dom4j介绍及使用实例
Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...
- Java XML解析器
使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...
- XML解析之SAX详解
XML解析之SAX详解 本文属于作者原创 http://www.cnblogs.com/ldnh/ XML解析的五个步骤 1.打开文档 (void)parserDidStartDocument:(NS ...
- XML解析(二) SAX解析
XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
- java xml解析方式(DOM、SAX、JDOM、DOM4J)
XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML ...
- 非常简单的XML解析(SAX解析、pull解析)
这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...
- XML解析之SAX
今天在敲代码的时候,想要实现地址选择功能,就是那个能够选择省.市.县的一个,用到的一个开源框架Android-PickerView,当然他这个里面尽管实现了能够选择的城市列表.可是他这是自己创建的,可 ...
- Java数据库编程及Java XML解析技术
1.JDBC概述 A. 什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...
随机推荐
- 【javascript基础】4、原型与原型链
前言 荒废了好几天,在宿舍闷了几天了,一直想着回家放松,什么也没搞,论文就让老师催吧.不过,闲的没事干的感觉真是不好,还是看看书,写写博客吧,今天和大家说说函数的原型. 原型是什么 第一次看到这个的时 ...
- vmware workstation LINUX磁盘扩容
1.edit virtual machine settings -> 选中硬盘->右侧utilities->expand(虚拟机不能存在镜像),输入要扩容到的大小 2.扩容之后进入系 ...
- PHP如何获取文件行数
本文实例讲述了PHP获取文件行数的方法.分享给大家供大家参考.具体分析如下:提供两种实现方法,虽然第二种简单易懂,但是第一种效率最好第一种: <?php $file_path = 'xxx.tx ...
- 剑指Offer:面试题22——栈的压入,弹出序列(java实现)
题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- LinQ To Object 基本用法
http://www.cnblogs.com/terryzh/archive/2012/11/10/2763538.html LinQ To Object 基本用法 inq的基本语法:var resu ...
- js处理用户输入的银行卡号实现四位一段,并且只能输入数字
其中ABC是输入框的id.type="tel"可直接呼出数字键盘. <input type="tel" maxlength="24" ...
- SQLSERVER | 查询数据库中所有的表的名字 | 查询数据库中的所有数据库名
SQLSERVER 1.查询某个数据库中所有的表名: SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 2.查询数据库中的所有数据库 ...
- JS打开新窗口的2种方式
1.超链接<a href="http://www.jb51.net" title="脚本之家">Welcome</a> 等效于js代码 ...
- 单机运行环境搭建之 --CentOS-6.5安装配置Tengine
一.安装pcre: cd /usr/local/src wget http://downloads.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34 ...
- vim总结
1.vim基础用法 注:该思维导图来自笔者<Linux就该这么学>读书笔记. 移动光标: 命令 描述 k 向上移动光标(移动一行) j 向下移动光标(移动一行) h 向左移动光标(移动一个 ...