JAVA-使用SAX解析XML数据
一、SAX (Simple API for XML)
- SAX解析XML文件采用的是事件驱动,它不需要解析完整个文档,而是一边按内容顺序解析文档,一般判断当前读到的字符是否符合XML语法中的某部分,如果符合则会回调一些函数来处理事件。
- 使用SAX的优点:SAX采用流的形式来处理,占用内存少。
二、事件处理器DefaultHandler
事件驱动的回调函数在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
获取解析器:
SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser();
解析XML数据:
//inputStream为读取XML数据时的输入流XMLPersonHandler mhandler = new XMLPersonHandler(); sp.parse(inputStream, mhandler);
四、对DefaultHandler子类的封装
XML中的数据获取主要在自定义DefaultHandler子类中,所以可以在子类里面进行数据的获取和封装。
对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 {} }
对一些层次比较深的结点数据,可以自定义的通过结点数据的信息来特定封装。
五、代码测试:
获取IT之家的新闻xml数据。
获取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;}}
封装的DefaultHandler子类:XMLGeneralHandler (如上)
测试类:
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){}}}
打印输出:
六、与PULL、DOM解析比较
- Dom解析xml,是先把全部数据读入到内存中,然后检索想要的数据,比较消耗内存,在xml文档比较小的情况下也可以考虑使用dom方式。
- android系统中,很多资源文件都是xml格式,android系统解析这些xml的方式,是使用pul解析器进行解析的,也是采用事件驱动进行解析的。解析应用本地的xml可以采用pull解析。
JAVA-使用SAX解析XML数据相关推荐
- Java用SAX解析XML
2019独角兽企业重金招聘Python工程师标准>>> Myhandler package com.heli.xml.sax;/*** 用SAX解析XML的Handler*/ imp ...
- Java 使用SAX解析XML文档
DOM,即Document Object Model,中文叫文档对象模型.DOM是W3C定义的标准文档对象模型,是一个与操作系统和编程语言无关的.用于内存存储和操作层次化文档的模型.当按 照DOM模型 ...
- java sax解析xml_【转】java使用sax解析xml文件
从下面这个url搬运.http://hck.iteye.com/blog/1175762 不过程序略有改动. 关于sax(搬自百科) SAX,全称Simple API for XML,既是指一种接口, ...
- Java:XML篇,使用SAX写入XML数据
1. 描述 参考:http://blog.csdn.net/hairongtian/article/details/7525292,Java中用SAX解析XML,具体包括读写,这篇是写入示范. 2. ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Java解析XML数据(三)——强大的XOM之simple-xml解析
前面已经了解了DOM和SAX两种解析方式,通过对比知道了DOM解析的核心是建立树模型,而SAX解析的核心是通过回调机制来实现.本篇文章将继续带大家用一种更为强大更为简单的工具来解析XML数据.我这里给 ...
- 【Java中级篇】Dom4j解析xml数据
一.依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId> ...
- SAX 解析XML文件:将XML转换成Java对象
本博客介绍的是解析本地XML文件,解析网络上的XML 本文写得比较简略,实际上项目应用更多的是解析网上的xml资源 使用SAX 处理XML需要一个Handler 对象,一般继承org.xml.sax, ...
- SAX解析XML文件
就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...
最新文章
- GM Tech 2 works with Hummer Yes or No
- 安全无忧,函数计算推出访问用户VPC功能,实现自定义的多类VPC网络资源互通...
- python-virtualenv虚拟环境的使用
- php 回调通知 连连支付_php怎么写连连支付退款
- DirectShow学习
- horizon client长时间不操作不断开_动挡操作禁忌,伤车只在一瞬间!否则变速箱会提前...
- windows下安装Python-Whl文件
- MongoDB的快速手动安装
- JS ||(或运算)详解
- 怎么样做好手机网站的优化和推广呢?
- oracle 扩展分区,Oracle在线扩展分区
- stm32使用AD采样需要注意的一些小问题
- markdown中数学符号和公式总结
- 腾讯云HiFlow场景连接器7月最受欢迎新应用模版推荐
- 【21世纪电脑入门】总目录——系统配置、包/库安装、问题修复
- 中国石油大学远程教育《穿出你的职业感》
- java datetime转int_java日期int和String互转
- 解决方案:Linux Ubuntu16.04 下无法挂载大容量U盘,优盘打不开
- Ubuntu 14.04 配置vim插件教程
- 前端架构师需要具备的技能_成为前端开发人员需要具备的最高技能