一、SAX (Simple API for XML)

  1. SAX解析XML文件采用的是事件驱动,它不需要解析完整个文档,而是一边按内容顺序解析文档,一般判断当前读到的字符是否符合XML语法中的某部分,如果符合则会回调一些函数来处理事件。
  2. 使用SAX的优点:SAX采用流的形式来处理,占用内存少。

二、事件处理器DefaultHandler

  1. 事件驱动的回调函数在DefaultHandler中,因此需要写一个DefaultHandler子类,然后在回调函数中处理相关的事件。

    public class XMLPersonHandler extends DefaultHandler {@Overridepublic void startDocument() throws SAXException {//开始解析xml之前的预处理}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// 解析到节点的开头标签'<...'时被调用// uri:命名空间// localName:不带命名空间前缀的标签名// qName:带命名空间的标签名// attributes:标签的属性集合 <person id="001"></person>// 如上,属性id在attributes中,获取标签数据如下:// attributes.getQName( ),attributes.getValue( )}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// 读取**开头标签**到'>'时被调用,获取标签所夹的内容。//<name>Jack</name>// ch[]:内容// start:起始位置// length:长度//获取内容:new String(ch,start,length);}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {//解析到结束标签时被调用 '/>'//<name>Jack</name>}@Overridepublic void endDocument() throws SAXException {//文档解析结束时被调用}
    }
    

三、解析器SAXParser

  1. 获取解析器:

    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp =  spf.newSAXParser();
    
  2. 解析XML数据:

    //inputStream为读取XML数据时的输入流XMLPersonHandler mhandler = new XMLPersonHandler();
    sp.parse(inputStream, mhandler);
    

四、对DefaultHandler子类的封装

  1. XML中的数据获取主要在自定义DefaultHandler子类中,所以可以在子类里面进行数据的获取和封装。

  2. 对xml的结点数据内容获取的简单封装:(不适合层次深的结点数据获取)

    public class XMLGeneralHandler extends DefaultHandler {private HashMap<String,String> map = null;private List<HashMap<String,String>> list = null;private String currentTag = null;private String currentValue = null;private String nodeName = null;public XMLGeneralHandler(String nodeName){this.nodeName = nodeName;}public List<HashMap<String,String>> getList(){return list;}@Overridepublic void startDocument() throws SAXException {list = new ArrayList<>();}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if(qName.equals(nodeName)){map = new HashMap<String,String>();if(attributes!=null && map!=null){for(int i=0;i<attributes.getLength();i++){map.put(attributes.getQName(i), attributes.getValue(i));}}}currentTag = qName;}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {if(currentTag!=null && map!=null){currentValue = new String(ch,start,length);if(currentValue!=null&&!currentValue.trim().equals("")&&!currentValue.trim().equals("\n")){map.put(currentTag,currentValue);}}currentTag = null;currentValue = null;}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if(qName.equals(nodeName)){list.add(map);map = null;}}@Overridepublic void endDocument() throws SAXException {}
    }
    
  3. 对一些层次比较深的结点数据,可以自定义的通过结点数据的信息来特定封装。

五、代码测试:

获取IT之家的新闻xml数据。

  1. 获取xml数据的输入流:

    public class HttpUtil {public static InputStream getXML(String path){InputStream inputStream = null;try{URL url = new URL(path);if(url!=null){HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);connection.setDoInput(true);connection.setRequestMethod("GET");int code = connection.getResponseCode();if(code == 200){inputStream = connection.getInputStream();}}}catch(Exception e){}return inputStream;}}
    
  2. 封装的DefaultHandler子类:XMLGeneralHandler (如上)

  3. 测试类:

    public class Test {public static void main(String[] args) {String path = "http://api.ithome.com/xml/newslist/news.xml";System.out.println(path);InputStream inputStream = HttpUtil.getXML(path);try{List<HashMap<String,String>> list = null;SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser sp =  spf.newSAXParser();XMLGeneralHandler mhandler = new XMLGeneralHandler("item");sp.parse(inputStream, mhandler);inputStream.close();list = mhandler.getList();for(HashMap<String,String> p:list){System.out.println(p.toString());}}catch(Exception e){}}}
    
  4. 打印输出:

六、与PULL、DOM解析比较

  1. Dom解析xml,是先把全部数据读入到内存中,然后检索想要的数据,比较消耗内存,在xml文档比较小的情况下也可以考虑使用dom方式。
  2. android系统中,很多资源文件都是xml格式,android系统解析这些xml的方式,是使用pul解析器进行解析的,也是采用事件驱动进行解析的。解析应用本地的xml可以采用pull解析。

JAVA-使用SAX解析XML数据相关推荐

  1. Java用SAX解析XML

    2019独角兽企业重金招聘Python工程师标准>>> Myhandler package com.heli.xml.sax;/*** 用SAX解析XML的Handler*/ imp ...

  2. Java 使用SAX解析XML文档

    DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...

  3. java sax解析xml_【转】java使用sax解析xml文件

    从下面这个url搬运.http://hck.iteye.com/blog/1175762 不过程序略有改动. 关于sax(搬自百科) SAX,全称Simple API for XML,既是指一种接口, ...

  4. Java:XML篇,使用SAX写入XML数据

    1. 描述 参考:http://blog.csdn.net/hairongtian/article/details/7525292,Java中用SAX解析XML,具体包括读写,这篇是写入示范. 2. ...

  5. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. Java解析XML数据(三)——强大的XOM之simple-xml解析

    前面已经了解了DOM和SAX两种解析方式,通过对比知道了DOM解析的核心是建立树模型,而SAX解析的核心是通过回调机制来实现.本篇文章将继续带大家用一种更为强大更为简单的工具来解析XML数据.我这里给 ...

  7. 【Java中级篇】Dom4j解析xml数据

    一.依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId> ...

  8. SAX 解析XML文件:将XML转换成Java对象

    本博客介绍的是解析本地XML文件,解析网络上的XML 本文写得比较简略,实际上项目应用更多的是解析网上的xml资源 使用SAX 处理XML需要一个Handler 对象,一般继承org.xml.sax, ...

  9. SAX解析XML文件

    就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...

最新文章

  1. GM Tech 2 works with Hummer Yes or No
  2. 安全无忧,函数计算推出访问用户VPC功能,实现自定义的多类VPC网络资源互通...
  3. python-virtualenv虚拟环境的使用
  4. php 回调通知 连连支付_php怎么写连连支付退款
  5. DirectShow学习
  6. horizon client长时间不操作不断开_动挡操作禁忌,伤车只在一瞬间!否则变速箱会提前...
  7. windows下安装Python-Whl文件
  8. MongoDB的快速手动安装
  9. JS ||(或运算)详解
  10. 怎么样做好手机网站的优化和推广呢?
  11. oracle 扩展分区,Oracle在线扩展分区
  12. stm32使用AD采样需要注意的一些小问题
  13. markdown中数学符号和公式总结
  14. 腾讯云HiFlow场景连接器7月最受欢迎新应用模版推荐
  15. 【21世纪电脑入门】总目录——系统配置、包/库安装、问题修复
  16. 中国石油大学远程教育《穿出你的职业感》
  17. java datetime转int_java日期int和String互转
  18. 解决方案:Linux Ubuntu16.04 下无法挂载大容量U盘,优盘打不开
  19. Ubuntu 14.04 配置vim插件教程
  20. 前端架构师需要具备的技能_成为前端开发人员需要具备的最高技能

热门文章

  1. 如何测试移动端APP
  2. Python 编程进阶经典算法逻辑编程 剑指Offer
  3. mac搭建redis集群
  4. 如何在淘宝普通店铺宝贝描述里添加背景图片添加 - 生活至上,美容至尚!
  5. 在父div中使文字垂直居上、垂直居下
  6. 仿制图章工具是干什么的?基础设置有哪些?仿制图章工具操作方法详细介绍
  7. webpack与grunt/glub 的比较
  8. IIS应用程序池总是关闭问题
  9. 代理模式 -虚拟代理 ProxyPattern
  10. 「图神经网络复杂图挖掘」 的研究进展