在我的另一篇文章(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文件的更多相关文章

  1. java 使用SAX解析xml 文件

    http://www.cnblogs.com/allenzheng/archive/2012/12/01/2797196.html 为了学习方便,忘博主勿究

  2. 用SAX解析xml文件,java

    (此文为(https://www.imooc.com/video/4482)之随笔) 1.用SAX解析xml文件大致分为三步 写了一个XML文件作为例子 (1)main方法代码如下: import j ...

  3. Java用SAX解析XML

    要解析的XML文件:myClass.xml <?xml version="1.0" encoding="utf-8"?> <class> ...

  4. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  5. java使用sax解析xml

    目的:解析xml文件,并存入mysql,并且要解析的字段能一一对应.这里解析的是微博的文件,想要利用里面的article和person_id字段. 思路: 为了能得到person_id和article ...

  6. Java是如何解析xml文件的(DOM)

    Java解析xml文件 在Java程序中读取xml文件的过程也称为"解析xml文件": 解析的目的: 获取 节点名和节点值 获取 属性名.属性值. 四中解析方式: DOM SAX ...

  7. 安卓SAX解析XML文件

    XML文件经常使用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法. 相比于DOM.SAX是一种速度更快,更有效的方法. 它逐行扫描 ...

  8. SAX解析xml文件

    需要做一个银行名字的列表. 因为有很多,所以想到了用xml来保存,然后uongDAX解析. public class BankSelectActivity extends BaseActivity{ ...

  9. Java 创建过滤器 解析xml文件

    今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...

随机推荐

  1. 全部leetcode题目解答(不含带锁)

    (记忆线:当时一刷完是1-205. 二刷88道.下次更新记得标记不能bug-free的原因.)   88-------------Perfect Squares(完美平方数.给一个整数,求出用平方数来 ...

  2. Oracle的SQL语句中的变量替换

    一.问题描述 如下SQL: INSERT INTO tmp(val)VALUES('a&b'); 执行过程中会出现如下提示: 点击"确定"过后我们查看表中的数据: b后面的 ...

  3. dell md3200i mdss (企业管理) 安装的那点事儿

    首先获取安装包,解压后如图: 我是在windows 机上安装,所以执行windows 文件夹下的可执行程序: 双击红箭头文件,进行安装,步骤截图如下: 出现最后这个界面,就说明安装成功,直接重启系统就 ...

  4. Thread Safety线程安全

    Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分 如果disabled就选择nts(php_stomp-1.0.9-5.5-nts-vc11-x86.zi ...

  5. ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)

    二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  6. Git 常用操作和问题解决

    记录一下自己用git作为项目管理过程中常见的错误以及处理方法 1.git pull 出现问题 git pull出现的问题多为远程分支文件和本地冲突 错误提示:error: Your local cha ...

  7. 在SharePoint 2013 Wiki Page中使用用户选择对话框

    JS部分: <script type="text/javascript"> function PeoplePicker() { var siteCollUrl = _s ...

  8. 模拟搭建Web项目的真实运行环境(四)

    本篇介绍如何部署mongodb环境,主要分为三个部分: 第一部分 介绍如何在ubuntu下安装mongodb, 第二部分 介绍如何在windows下安装使用MongoChef客户端, 第三部分 介绍在 ...

  9. CentOS下yum安装LAMP

    1. 用yum安装Apache,Mysql,PHP. 1.1安装Apache yum install httpd httpd-devel 安装完成后,用/etc/init.d/httpd start  ...

  10. Xcode 突然有部分文件不显示

    今天突然Xcode抽风了,突然我的项目中的文件好多不显示出来,本地文件夹都有,见鬼了..... 真心坑死了,于是乎就找度娘了,果然被我发现了 看见这个蓝色小时钟没呀,就是他在捣鬼,我点击一下变成灰色就 ...