【Java】XML解析之SAX

SAX介绍

  SAX是一种事件驱动的流式XML文件处理方式,区别与DOM方式的是不需要在内存中建一棵DOM树,而是根据读取XML时遇到的标签事件来顺序处理,因此具有速度快,内存占用上的优点。

XML生成

  代码如下:

  

 1 package com.test.sax;
 2
 3 import javax.xml.transform.OutputKeys;
 4 import javax.xml.transform.Result;
 5 import javax.xml.transform.Transformer;
 6 import javax.xml.transform.TransformerConfigurationException;
 7 import javax.xml.transform.sax.SAXTransformerFactory;
 8 import javax.xml.transform.sax.TransformerHandler;
 9 import javax.xml.transform.stream.StreamResult;
10
11 import org.xml.sax.SAXException;
12 import org.xml.sax.helpers.AttributesImpl;
13
14 public class TestCreateXml {
15
16     public static void main(String[] args) {
17         //创建SAXTransformerFactory实例
18         SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
19         try {
20             //创建TransformerHandler实例
21             TransformerHandler handler = factory.newTransformerHandler();
22             //创建Transformer实例
23             Transformer transformer = handler.getTransformer();
24             //设置输出的xml属性,encoding为编码,
25             transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
26             //indent是确保输出的xml文件能够自动换行
27             transformer.setOutputProperty(OutputKeys.INDENT, "yes");
28
29             //创建Result对象,将Result对象加载到TransHandler中
30             // 注意:1、这一步必须在Transformer.setOutputProperty()之后,不然设置的xml属性将不生效
31             // 2、这一步也必须在TransformerHandler.startDocument()之前,不然会报错。
32             // 分析源码后发现,startDocument()会先判断result是否为空,为空则报错
33             Result result = new StreamResult("src/test-sax-create.xml");
34             handler.setResult(result);
35
36             // 创建属性Attribute对象
37             AttributesImpl attr = new AttributesImpl();
38             //开始写文件
39             handler.startDocument();
40             //写入根节点conpany
41             handler.startElement("", "", "conpany", attr);
42
43             //清空属性,
44             attr.clear();
45             //设置属性
46             attr.addAttribute( "", "", "name", "", "1");
47             //写入根节点的子节点book
48             handler.startElement("", "", "department", attr);
49
50             attr.clear();
51             //分别写入book节点的子节点
52             attr.addAttribute( "", "", "name", "", "employee1");
53             attr.addAttribute( "", "", "id", "", "1");
54             handler.startElement("", "", "employee", attr);
55             //写入子节点内容
56             handler.characters("123".toCharArray(), 0, "123".toCharArray().length);
57             //写入子节点末尾
58             handler.endElement("", "", "employee");
59             //写入department节点末尾
60             handler.endElement("", "", "department");
61             //写入根节点末尾
62             handler.endElement("", "", "conpany");
63             //写文件结束
64             handler.endDocument();
65         } catch (TransformerConfigurationException e) {
66             e.printStackTrace();
67         } catch (SAXException e) {
68             e.printStackTrace();
69         }
70     }
71 }

生成文件如下:

  

XML解析

  代码如下:

  

 1 package com.test.sax;
 2
 3 import java.io.IOException;
 4 import java.util.ArrayList;
 5 import java.util.HashMap;
 6 import java.util.List;
 7 import java.util.Map;
 8
 9 import javax.xml.parsers.ParserConfigurationException;
10 import javax.xml.parsers.SAXParser;
11 import javax.xml.parsers.SAXParserFactory;
12
13 import org.xml.sax.Attributes;
14 import org.xml.sax.SAXException;
15 import org.xml.sax.helpers.DefaultHandler;
16
17
18 public class TestParseXml {
19
20     public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
21         //创建SAXTransformerFactory实例
22         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
23         //创建TransformerHandler实例
24         SAXParser saxParser = saxParserFactory.newSAXParser();
25
26         MyHandler myHandler = new MyHandler();
27
28         saxParser.parse(TestParseXml.class.getClassLoader().getResourceAsStream("test.xml"), myHandler);
29     }
30
31 }
32
33
34 class MyHandler extends DefaultHandler{
35
36     /**
37      * 开始解析文档时,调用的方法
38      */
39     @Override
40     public void startDocument() throws SAXException {
41         System.out.println("---------startDocument-------");
42     }
43
44     /**
45      * 文档解析完结时,调用的方法
46      */
47     @Override
48     public void endDocument() throws SAXException {
49         System.out.println("---------endDocument-------");
50         super.endDocument();
51     }
52
53     /**
54      * 开始解析每个元素时,调用的方法,会重复调用
55      */
56     @Override
57     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
58
59         //qName 元素标签
60         System.out.println("---------startElement-------" + qName);
61
62         // 处理属性
63         if(attributes != null )
64         {
65             for (int i = 0; i < attributes.getLength(); ++i)
66             {
67                 String attrName = attributes.getQName(i);
68                 String attrValue = attributes.getValue(i);
69                 System.out.print("\t "+ attrName +  "=" + attrValue);
70             }
71         }
72         System.out.println("");
73     }
74
75     @Override
76     public void endElement(String uri, String localName, String qName) throws SAXException {
77
78         System.out.println("---------endElement-------" + qName);
79     }
80
81     /**
82      * 解析到每个元素的内容时会调用此方法
83      */
84     @Override
85     public void characters(char[] ch, int start, int length) throws SAXException {
86         String content = new String(ch,start,length);
87         System.out.println("---------characters-------" + "content == "+ content);
88     }
89 }

控制台输出:

  

 1 ---------startDocument-------
 2 ---------startElement-------conpany
 3      name=hd
 4 ---------characters-------content ==
 5
 6 ---------startElement-------department
 7      name=department1
 8 ---------characters-------content ==
 9
10 ---------startElement-------employee
11      name=employee1     id=1
12 ---------characters-------content == 123
13 ---------endElement-------employee
14 ---------characters-------content ==
15
16 ---------endElement-------department
17 ---------characters-------content ==
18
19 ---------startElement-------department
20      name=department2
21 ---------characters-------content ==
22
23 ---------startElement-------employee
24      name=employee2     id=2
25 ---------characters-------content == 321
26 ---------endElement-------employee
27 ---------characters-------content ==
28
29 ---------startElement-------employee
30      name=employee3     id=3
31 ---------endElement-------employee
32 ---------characters-------content ==
33
34 ---------endElement-------department
35 ---------characters-------content ==
36
37 ---------startElement-------department
38      name=department3
39 ---------characters-------content ==
40
41 ---------endElement-------department
42 ---------characters-------content ==
43
44 ---------endElement-------conpany
45 ---------endDocument-------
时间: 2024-10-01 05:07:42

【Java】XML解析之SAX的相关文章

Java XML解析技术

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已.基本的解析方式有两种,一种叫SAX,另一种叫DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程

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

这里只是把解析的数据当日志打出来了 非常简单的xml解析方式 1 package com.example.demo.service; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parse

Java xml 解析

1. XML框架结构 Java SE 6 平台提供的 XML 处理主要包括两个功能:XML 处理(JAXP,Java Architecture XML Processing)和 XML 绑定(JAXB,Java Architecture XML Binding). JAXP 包括 SAX 框架 —— 遍历元素,做出处理:DOM 框架 —— 构造 XML 文件的树形表示:StAX 框架 —— 拖拽方式的解析:XSLT 框架 —— 将 XML 数据转换成其他格式.JAXB 则是负责将 XML 文件和

java XML解析

package com.kpsh.myself; import java.io.File;import java.io.FileInputStream;import java.util.List; import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory; import org.dom4j.Document;import org.dom4j.DocumentHelper;imp

XML解析(二) SAX解析

XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得. 注意SAXParser的parse()方法: parse(String uri, DefaultHandler dh),parse(File f, DefaultHandler dh)等都需要传递一个DefaultHandler的对象. 查看API帮助手册可知,SAX解析是事件驱动的,De

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

XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML元素都必须有关闭标签. XML标签对大小写敏感,并且所有属性值date都需加引号. XML元素: XMl元素是只从包括开始标签到结束标签的部分,元素可包含其他元素.文本或两者都包含,也可拥有属性. XML解析 基础方法:DOM.SAX DOM解析:平台无关的官方解析方式 SAX解析:Java中基于事

几种常见的xml解析方式 SAX,DOM,PULL以android为例

准备工作 首先是一个person.xml文件 <?xml version="1.0" encoding="UTF-8"?> <persons> <person id="18"> <name>allen</name> <age>36</age> </person> <person id="28"> <name>

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

1.JDBC概述 A.  什么是JDBC? Java DataBase Connectivity:是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成.通过这些类和接口,JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果 B.  JDBC的常用类和接口:DriverManager类, Connection接口, Statement接口, PreparedStatement接口, ResultSet接口 2.JDBC编程步骤 1). 加载驱动程序 Cl

Java XML解析之DOM

DOM解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内存中进行解析,因此当XML文件较大时,使用DOM解析效率会降低,而且可能造成内存溢出. 当XML文件较大时应采用SAX解析(下一篇中会介绍).通常情况下,若XML文件只是用作系统的配置文件,文件一般不会很大,使用DOM解析基本就能解决问题. 以下分别是解析和生成xml的基本步骤: 1. XML解析: 上文已经说过DOM解析时是将整个XML文件加载到内存中,