【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语言编写的类和接口组成.通过这些类和接口 ...
随机推荐
- IT之人生感悟
从实习到现在,一直在做程序开发,工作了也有1年了吧,日子也就这么浑浑噩噩的过去了,想想将要毕业那会,原本有想考研的打算,最后还是出于各方面考虑不了了之,相比考研族提早步入了社会,既然路是自己选的,那必 ...
- qt编程入门
面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...
- cocoapod 安装
淘宝镜像: sudo gem sources -a https://ruby.taobao.org/ sudo gem sources --remove https://rubygems.org/ 安 ...
- 10.11 安装pod
原文地址:http://www.jianshu.com/p/5fc15906c53a 感谢. 更新升级10.11 cocoapods安装出问题最简单的解决方法 这是因为10.11把cocoapods ...
- python序列化: json & pickle & shelve 模块
一.json & pickle & shelve 模块 json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进 ...
- 【EF学习笔记05】----------DBContext基础查询
遍历所有实体 //遍历所有学生 DBSet using (var db = new Entities()) { foreach (var student in db.Student) { Object ...
- mybaits中xml文件大于号和小于号的处理方法
1.转义字符 原符号 < <= > >= & ' " 替换符号 < <= > >= & ' " 2 ...
- APP分发渠道的竞争分析
一. 最近几年,手机APP市场发展非常迅速,随着手机的硬件水平的不断升级,大量资本涌入,越来越多的开发者从桌面平台开发转移到移动平台开发,面对数以万计的手机APP,如何推广自己的APP成了难题,APP ...
- Repeater控件 ---表格展示数据
简介: Repeater控件是Web 服务器控件中的一个容器控件,它使您可以从页的任何可用数据中创建出自定义列表. Repeater 控件不具备内置的呈现功能,这表示用户必须通过创建模板为 Repea ...
- SQL Server 查询处理中的各个阶段(SQL执行顺序)
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...