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. python(26)查看文件的大小

    有时候,在写文件的时候需要判断文件的大小,或者删除空的文件 import os from os.path import join, getsize def getdirsize(dir): size ...

  2. 从头来之【图解针对虚拟机iOS开发环境搭建】

    1.下载Mac OSX10.9. 点击下载 2.下载VMware Workstation 10,点击下载,网页中包含序列号.安装VM. 3.VM10-MacOS补丁.用于创建苹果虚拟机. 安装VM就不 ...

  3. List与字符串转换

    1.将list元素用单引号引起来:List<TransferFocusxfSummaryTop3> topList = getTransferFocusxfSummaryTop3(user ...

  4. ChartControl

    <dxc:ChartControl Name="chartControl1">            <dxc:ChartControl.Diagram>  ...

  5. Android 多点触控与简单手势(一)

    现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...

  6. EXT学习之——EXT下拉框默认绑定第一个值

    //默认第一个下拉框绑定值if (this.moduleCombo.store.getAt(0) != undefined) { this.moduleCombo.setValue(this.modu ...

  7. Android Menu 主菜单是使用

    在Android里面每个Activity都绑定了一个Menu(菜单)有些时候我们需要使用到菜单.用法很简单,我们只需要重写onCreateOptionsMenu和onOptionsItemSelect ...

  8. swift 常见报错及解决方案

    当你初学swift,或者你从2.0转到3.0,见点红是在所难免再寻常不过的事情,其实一般也都是一些小的语法问题,度娘一般都有能力告诉你答案,但是凡事做个总结做到心中有数毕竟是比度娘靠谱的. 1.can ...

  9. C# JSON to object

    /// <summary> /// json格式转换(引用System.Web.Extension类库) /// </summary> /// <param name=& ...

  10. BCB 中测量Richedit 的文本总行高

    RICHEDIT 富文本控件可以容纳各种字体,那么如果我们想要知道文本的总行高如何做呢? 比如,我们想判断,richedit中的文本内容有没有超出richedit 的范围,如何实现呢? 1,需要使用E ...