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 ...
随机推荐
- PHPSTORM设置新建PHP文件头部注释
1.选择 File|setting 2.在Editor|File and Code Templates,见下图标记更改即可
- Photoshop学习笔记
视频地址:PhotoshopCS5视频教程 1.打开文件的快捷方式:软件刚启动时,双击绘图区域 2.文件->新建,弹出的新建对话框中,包含了剪切板及纸张的相关信息 3.图像缩放快捷方式:ctrl ...
- javascript export excel
<input type="button" onclick="tableToExcel('tablename', 'name')" value=" ...
- 为什么使用Junit Test而不用普通java main方法来完成测试?
因为在程序里边,一个接口对应一个实现方法,而在接口中常常会定义相关的很多方法,所以在测试的时候,如果都在main方法里边进行测试,main方法就会显得臃肿,而且不便于以后其他人测试以及查看测试数据,用 ...
- docker--初体验
docker这个词已经越来越热,很多docker的概念是从周围人和知乎上看的,打算从功能上先了解docker,深入的话放在以后. ps:正好手头有一台腾讯云的vps,单核,1G内存,可以拿来做实验,腾 ...
- ASP.NET知识总结(8.AJAX异步)
AJAX:”Asynchronous JavaScript and XML” 中文意思:异步JavaScript和XML. 指一种创建交互式网页应用的网页开发技术. 不是指一种单一的技术,而是有机 ...
- 导出(Excel格式)
poi导出,需要的poi jar包: 步骤一.两个工具类: 1.ExcelUtil.java package util; import java.awt.Color; import java.io.F ...
- javascrip中cookie的使用详细分析
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- 感知机(perceptron)概念与实现
感知机(perceptron) 模型: 简答的说由输入空间(特征空间)到输出空间的如下函数: \[f(x)=sign(w\cdot x+b)\] 称为感知机,其中,\(w\)和\(b\)表示的是感知机 ...
- AOJ 0033 Ball【DFS】
有一个筒,从A口可以放球,放进去的球可通过挡板DE使其掉进B管或C管里,现有带1-10标号的球按给定顺序从A口放入,问是否有一种控制挡板的策略可以使B管和C管中的球从下往上标号递增. 输入: 第一行输 ...