JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使用SAX来解析XML文件,就不多说介绍了,还是只介绍如何使用和使用流程,具体其他的细节属性等,朋友们可以查阅文档,在学习工作中慢慢积累!
XML文件还是上次那个:
<?xml version="1.0" encoding="UTF-8"?> <Root> <Book> <name>偷影子的人</name> <author>马克李维</author> <year>2010</year> </Book> <Book> <name>人生不设限</name> <author>尼克胡哲</author> <year>2010</year> </Book> </Root>
这次使用SAX解析XML文件的JAVA代码:
package com.minlz.xml; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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; /** * @author minliangzhi * @date 2016年9月7日 * SIMPLE API FOR XML * SAX是一种基于流的解析方法,通过逐行扫描文档并解析,可以不必一次性加载大型文档进入内存(优势所在) */ public class SaxParser { public static void main(String[] args) { /** * 使用SAX解析XML和使用DOM的方法大致相同,也是通过工厂模式获取相应的解析器 * 构建解析工厂,构建解析器,进行解析文档,不同的是,SAX需要提供一个解析过程中的Handler, * 我们需要实现相应的方法,来完成文档的解析工作 */ SAXParserFactory facotry = SAXParserFactory.newInstance(); try { SAXParser parser = facotry.newSAXParser(); MySAXHandler handler = new MySAXHandler(); parser.parse("resources/books.xml", handler); Map<Integer, Map<String, Object>> entities = handler.getEntityes(); List<SaxBook> books = new ArrayList<SaxBook>(); for(Map<String, Object> map : entities.values()) { books.add(buildObject(SaxBook.class, map)); } for(SaxBook book : books) { System.out.println(book); } } catch (Exception e) { e.printStackTrace(); } } private static <T> T buildObject(Class<T> clazz, Map<String, Object> attributes) { T t = null; try { /** 初始化一个实例 */ t = clazz.newInstance(); Field[] allFields = clazz.getDeclaredFields(); /** 遍历所有属性,如果发现已经提供了属性的值,则设置该值 */ for(Field f : allFields) { if(attributes.containsKey(f.getName())) { f.setAccessible(true); f.set(t, attributes.get(f.getName())); } } } catch (Exception e) { e.printStackTrace(); } return t; } } class MySAXHandler extends DefaultHandler { /** * 存储解析出来的每个实体属性集合 */ Map<Integer, Map<String, Object>> entityes = null; /** * 已经解析的实体数目 */ private int size; /** * 正在开始解析的节点(我们只是记录了属性节点) */ private String currentTag = null; public MySAXHandler() { entityes = new HashMap<Integer, Map<String, Object>>(); } /** * 开始解析XML文件的时候调用 和endDocument()方法一样,都是被调用一次 */ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("MySAXHandler 开始解析XML文件"); } /** * XML文件解析结束的时候调用 和startDocument()方法一样,都是被调用一次 */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("MySAXHandler 结束解析XML文件"); } /** * 开始解析一个元素标签的时候进行调用 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if(qName.equals("Book")) { // 实体开始节点 size ++; Map<String, Object> att = new HashMap<String, Object>(); entityes.put(size, att); } else if(!qName.equals("Root")){ // 属性节点 currentTag = qName; } } /** * 获取元素内容调用 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); if(currentTag != null) { // 开始解析一个属性节点 (根据currentTag的设置时间点,这里只会处理属性节点) String currentValue = new String(ch, start, length); if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){ entityes.get(size).put(currentTag, currentValue); } } } /** * 元素解析完成时调用 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); } public Map<Integer, Map<String, Object>> getEntityes() { return entityes; } public void setEntityes(Map<Integer, Map<String, Object>> entityes) { this.entityes = entityes; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } } class SaxBook { private String name; private String author; private String year; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } @Override public String toString() { return "Book [name=" + name + ", author=" + author + ", year=" + year + "]"; } }
解析结果:
MySAXHandler 开始解析XML文件 MySAXHandler 结束解析XML文件 Book [name=偷影子的人, author=马克李维, year=2010] Book [name=人生不设限, author=尼克胡哲, year=2010]
有关于每个方法和使用规则,在代码中已经有相印的解释,朋友们可以把代码粘贴到自己的编辑器中运行跟踪查看。
最后:
如果错误,还请指正,不胜感激!
JAVA使用SAX解析XML文件的更多相关文章
- java 使用SAX解析xml 文件
http://www.cnblogs.com/allenzheng/archive/2012/12/01/2797196.html 为了学习方便,忘博主勿究
- 用SAX解析xml文件,java
(此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...
- Java用SAX解析XML
要解析的XML文件:myClass.xml <?xml version="1.0" encoding="utf-8"?> <class> ...
- sax解析xml文件的DefaultHandler处理类
一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...
- java使用sax解析xml
目的:解析xml文件,并存入mysql,并且要解析的字段能一一对应.这里解析的是微博的文件,想要利用里面的article和person_id字段. 思路: 为了能得到person_id和article ...
- Java是如何解析xml文件的(DOM)
Java解析xml文件 在Java程序中读取xml文件的过程也称为"解析xml文件": 解析的目的: 获取 节点名和节点值 获取 属性名.属性值. 四中解析方式: DOM SAX ...
- 安卓SAX解析XML文件
XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...
- SAX解析xml文件
需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...
- Java 创建过滤器 解析xml文件
今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...
随机推荐
- linux下查看和添加PATH环境变量
linux下查看和添加PATH环境变量 $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑你的 PA ...
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- 不一样的dynamic解析json 万能方法
写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...
- UIAutomator
UI Automator Viewer The uiautomatorviewer tool provides a convenient GUI to scan and analyze the UI ...
- sh1.shell脚本练习
练习: 1.写一个脚本 判断当前系统上是否有用户的默认shell为bash 如果有,就显示其中一个的用户名:否则,就显示没有这类用户. #!/bin/bash grep "bash$&quo ...
- Linux学习日记之磁盘与档案系统
主要定义 磁盘的物理组成磁盘主要由圆形磁盘(多张).机械手臂.磁头等组成.每张磁盘都有不同的磁道,半径相同的磁道组成了磁柱,沿着中心划线可将磁盘分成若干扇区,每个扇区的大小是512Bytes. 磁盘分 ...
- Python中的网络编程
TCPServer端: __author__ = 'Nature' # -*- coding: utf-8 -*- from socket import * from time import ctim ...
- H5(三)
Canvas(画布) 基本内容 简单来说,HTML5提供的新元素<canvas> Canvas在HTML页面提供画布的功能 在画布中绘制各种图形 C ...
- C#中的隐式类型var——详细示例解析
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...
- postgresql 设置只读用户
postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...