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 ...
随机推荐
- 【Tomcat】解决Eclipse无法添加Tomcat Service问题
直接上图:今天因为弄Maven的时候,不小心把Tomcat7 Service 给弄没了,没法直接添加. 可以参照上图的结构进行 Download and Install...点击之后等待一会儿. 其实 ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (三)
紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...
- Spring mvc中@RequestMapping 6个基本用法
Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: Java代码 @Reques ...
- studing(来自转载)
1.getchar(): http://www.cnblogs.com/jiangjun/archive/2012/05/16/2503676.html 2.gets()和scanf( ): http ...
- wireshark使用方法总结
Wireshark基本用法 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口. ...
- 文件管理[Linux]
文件系统 rootfs: 根文件系统 /boot 系统启动相关的文件,如内核.initrd.以及grub(bootloader) /dev 设备文件 块设备 随机访问 字符设备 线性访问 设备号 主设 ...
- Jquery便利对象
xhr=[object object] $.each(xhr, function (key, val) { alert(key + '=' + val); ...
- Zookeeper操作
Zookeeper操作 注意搭建: 1.集群规模不小于3个节点 2.服务器之间系统时间要保持一致 1.搭建步骤: 1.解压安装包 2.设置zookeeper环境变量 3.修改配置文件————zoo.c ...
- MIT 6.828 JOS学习笔记11 Exercise 1.8
Exercise 1.8 我们丢弃了一小部分代码---即当我们在printf中指定输出"%o"格式的字符串,即八进制格式的代码.尝试去完成这部分程序. 解答: 在这个练 ...
- 视图views粗略理解
>>>>>> >>>> 创建视图: create view goodsavgview as select cat_id,avg(shop_ ...