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的更多相关文章

  1. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  2. Java XML解析器

    使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...

  3. XML解析之SAX详解

    XML解析之SAX详解 本文属于作者原创 http://www.cnblogs.com/ldnh/ XML解析的五个步骤 1.打开文档 (void)parserDidStartDocument:(NS ...

  4. XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  5. 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来 ...

  6. java xml解析方式(DOM、SAX、JDOM、DOM4J)

    XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML ...

  7. 非常简单的XML解析(SAX解析、pull解析)

    这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 package com.example.demo.service; import java.io.IOException; import ...

  8. XML解析之SAX

    今天在敲代码的时候,想要实现地址选择功能,就是那个能够选择省.市.县的一个,用到的一个开源框架Android-PickerView,当然他这个里面尽管实现了能够选择的城市列表.可是他这是自己创建的,可 ...

  9. Java数据库编程及Java XML解析技术

    1.JDBC概述 A.  什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口 ...

随机推荐

  1. linux下开启mysql慢查询,分析查询语句

    一,为什么要开启这个查询呢? 数据库是很容易产生瓶颈的地方,现在Nosql大家讨论这么热,估计都被数据库搞郁闷了.mysql中最影响速度的就是那些查询非常慢的语句,这些慢的语句,可能是写的不够合理或者 ...

  2. powerDesigner 报Unable to connect SQLState=08004 解决方法

    在使用PowerDesigner配置数据库连接(configure connections)的时候,点击Test connection之后弹出Unable to connect SQLState=08 ...

  3. delphi 常用的将窗口置前的函数

    function BringWindowToTopEx(hWnd: HWND): Boolean;begin if IsIconic(hWnd) then ShowWindow(hWnd, SW_RE ...

  4. 全面了解 Linux 服务器 - 1. 查看 Linux 服务器的 CPU 详细情况

    1. 查看 Linux 服务器的 CPU 详细情况 判断依据: 具有相同的 core id 的 CPU 是同意个 core 超线程. 具有相同的 physical id 的 CPU 是同一个 CPU ...

  5. Blackfin DSP(七):用SPORT口模拟SPI

    1.问题的提出 当系统从SPI device启动时,若SCLK = 133M,则SPI的最大速度为33M.然而,有一些串行的flash设备能更快的运行,因此,如果我们使用SPORT口,它的最大速度为S ...

  6. Linux学习笔记(一)

    1.正则表达式 \w 匹配任何字类字符,包括下划线.与“[A-Za-z0-9_]”等效. \W 与任何非单词字符匹配.与“[^A-Za-z0-9_]”等效. +    一次或多次匹配前面的字符或子表达 ...

  7. SmartWiki文档在线管理系统简介

    简介 SmartWiki是一款针对IT团队开发的简单好用的文档管理系统.可以用来储存日常接口文档,数据库字典,手册说明等文档.内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需 ...

  8. flask一些资料

    http://shulhi.com/celery-integration-with-flask/ https://jeffknupp.com/blog/2014/01/29/productionizi ...

  9. TabCtrl的基本用法

    MFC TabCtrl控件的使用方法及思路 1.建立基于Dialog的应用程序 2.添加TabCtrl控件,并关联变量 3.建立TabCtrl中存放的Dialog子对话框若干,并关联类 4.在Tabc ...

  10. AngularJS 中设置 AJAX get 请求不缓存的方法

    var app = angular.module('manager', ['ngRoute']); app.config(['$routeProvider', function($routeProvi ...