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 ...
随机推荐
- 一段SQL
如何将会计分录流水合并成会计分录,环境oracle 11g,代码如下: 表: CREATE TABLE "DEMO_VCH" ("SET_NO" BYTE), ...
- mui项目中如何使用原生JavaScript代替jquery来操作dom 转自【B5教程网】:http://www.bcty365.com/content-146-3661-1.html
最近在用mui写页面,当然了在移动App里引入jq或zepto这些框架,肯定是极不理性的.原生JS挺简单,为何需要jq?jq的成功当时是因为ie6.7.8.9.10.chrome.ff这些浏览器不兼容 ...
- ->code vs 1474 十进制转m进制
1474 十进制转m进制 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 将十进制数n转换成m进 ...
- tp5 model 中的软删除
model中需use traits\model\SoftDelete; // 数据表中需添加一个 delete_time 字段保存删除时间 namespace app\index\model; use ...
- Delphi XE 10 DataSnap TCP 与 HTTP 比较
在网络程序开发过程中,面临TCP HTTP 的选择上往往让人陷入犹豫不决中,http的灵活和较强的穿透能力是TCP无法与之相提并论的,然而在响应速度和处理能力上却能看出后者比前者足够强大的地方.因此 ...
- js获取cookie
js获取cookie 之前用jQuery.cookie来获取cookie,虽然简单,但是项目上又多引用了一个插件,总觉得不太好,下面是我封装的js原生获取cookie的函数. function get ...
- MFC注册窗口类以及FindWindow按窗口类名查询
很多玩游戏的人都知道一般游戏客户端程序是不允许双开的,就是说在同一游戏在启动的时候,是无法打开多个窗口.很多其他软件如酷狗播放器等也是这样.如果把打开的窗口最小化,这时重新启动程序,最小化的窗口会被显 ...
- 使用WGET参数介绍大全
wget 是一个命令行的下载工具.对于我们这些 Linux 用户来说,几乎每天都在使用它.下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget. $ wget -r -n ...
- windows 用默认软件打开文档
System.Diagnostics.Process.Start("Explorer.exe", string.Format("/e, \"{0}\" ...
- js中substr,substring,slice。截取字符串的区别
substr(n1,n2) n1:起始位置(可以为负数) n2:截取长度(不可以为0,不可以为负数,可以为空) 当n1为正数时,从字符串的n1下标处截取字符串(起始位置),长度为n2. 当n1为负数时 ...