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 ...
随机推荐
- iOS Architectures 浅谈
iOS项目打包,或者只是在项目里面调用第三方静态库抑或是自己新建一个静态库,就要无可避免的和Architectures打交道.Architectures在Targets面板的Build Setting ...
- iOS6_自动约束 Constraints
取消Constraints(约束) 问题描述:xib文件设计的时候控件已经摆好位置,但是每次调试的时候控件的位置又乱了 解决方法:选中 xib文件,在右侧第一项(Identity and type)的 ...
- iOS开发UI篇—CAlayer(自定义layer)
iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...
- No plugin found for prefix 'mybatis-generator' in the current project
http://blog.csdn.net/you23hai45/article/details/50792430 1.错误描述 F:\workspaces\Mybatis>mvn mybatis ...
- CSS样式表基础
CSS的样式表其实就是美观页面的,加一些样式. 一.样式表的三种分类: ①内联样式:写在某一个标签里面的样式. 优点:控制精确. 缺点:代码重用性差.(太多了不好写)页面代码乱.(太乱,后期不方便看) ...
- Mahout推荐算法API详解
转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...
- div不换行_div同行_div强制不换行
使用Float <!--已知两个div的宽度使用[Float]使两个DIV同行!注:float使用后需要清除:所以多写一个div--> <div style="width: ...
- C 标准库系列之locale.h
locale.h 区域设置相关,主要针对时间日期.货币格式.字符控制.数字格式等以满足某区域的设置需要. locale设置类别主要包括以下几个宏定义的类别: LC_ALL:设置所有的类别: LC_CO ...
- activemq 控制面板里的 Number Of Pending Messages、 Messages Enqueued、Messages Dequeued含义
Number Of Consumers 消费者 这个是消费者端的消费者数量 Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队 ...
- 【ajax 提交表单】多种方式的注意事项
在业务中,可能因为表单内容过于庞大,字段过于繁杂,如果人为去拼接的话 ,需要耗费大量的时间和精力,与此同时,代码看上去也是冗余不堪. 所以,提交表单的时候如果能整个表单数据整体提交,那是非常开心的事情 ...