已经好久没有更新博客了,炎热的夏天正如我的心情一样枯燥乏味,今年是互联的寒冬,作为一个菜鸟已经深深的感觉到了,因为自己失业了。从去年的年末的一些听闻,自己竟没有准备好迎接失业,以至于一年了,只比以前强了一点。没错,自我感觉就是一个点,非常渺小的一个小点。以至于本痛彻心扉告别了自己喜欢的LoL,这也许是个时机把,让自己的心沉淀下来。

人们常说干一行,爱一行,自己想了一会儿,真的很想打自己。自己做的只是应付差事,甚至是喜欢都谈不上,又怎么能不成现在这个样子呢!我之前一直在想,自己如果把玩游戏的精力、时间、喜好程度换到学习代码上面,那么肯定过的比现在好。至少失业后能立即找到工作,或者是面试量是现在的好几倍,好了不多说了,自己正在改邪归正中。

上一篇写到了用dom来解析Andorid中的xml文件,今天看看sax这个解析,顺别把Java转义符号做个表格展示一下。

 SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备。

  SAX解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方式,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。并且,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

  在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHandle、DTDHandler、ErrorHandler以及EntityResolver这4个接口。XMLReader通过相应事件处理器注册方法setXXX()来完成的与ContentHandle、DTDHandler、ErrorHandler以及EntityResolver这4个接口的连接。

  什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。

  优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。

  缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。

  使用场合:机器有性能限制。

下面是大致使用的方法

//用于处理文档解析开始事件
public  void  startDocument() throws  SAXException
//处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性类表等信息
public  void  startElement(String namespacesURI , String localName , String qName , Attributes atts)  throws  SAXException
//处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息
public  void  endElement(String namespacesURI , String localName , String qName)  throws  SAXException
//处理元素的字符内容,从参数中可以获得内容
public  void  characters( char [] ch ,  int  start ,  int  length)   throws  SAXException

我们创建一个项目

在上一篇中有一个错误,assets文件夹应该创建在main下面,下面列出创建步骤

创建完成之后我们便写入数据

<?xml version="1.0" encoding="UTF-8"?>
<gen><layer><type>\ddd</type><value>1~3位八进制数据所表示的字符,如 \456</value></layer><layer><type>\dxxxx</type><value>4~16位十六进制数据所表示的字符,如 \0052</value></layer><layer><type>\'</type><value>单引号字符</value></layer><layer><type>\\</type><value>反斜杠字符</value></layer><layer><type>\t</type><value>垂直制表符,将光标移到下一个制表符的位置</value></layer><layer><type>\r</type><value>回车</value></layer><layer><type>\n</type><value>换行</value></layer><layer><type>\b</type><value>退格</value></layer><layer><type>\f</type><value>换页</value></layer></gen>

然后我们建立一个实体类便于操作

public class Data {public String getType() {return type;}public void setType(String type) {this.type = type;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}private  String type;private String  value;@Overridepublic String toString() {return"type='" + type + '\'' +", value='" + v
public class ContenHanler extends DefaultHandler {private List<Data> datas = null;private Data currenData;private String tagName;public List<Data> getData() {return datas;}


我们接着继续创建解析解析类//当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。@Overridepublic void startDocument() throws SAXException {super.startDocument();datas = new ArrayList<>();}//当读到一个开始标签的时候,会触发这个方法,再次获得元素的属性。namespaceURI就是命名空间,localName是不带命名空间前缀的标签名,qName是带命名空间前缀的标签名。通过attributes可以得到所有的属性名和相应的值。要注意的是SAX中一个重要的特点就是它的流式处理,当遇到一个标签的时候,它并不会纪录下以前所碰到的标签,也就是说,在startElement()方法中,所有你所知道的信息,就是标签的名字和属性,至于标签的嵌套结构,上层标签的名字,是否有子元属等等其它与结构相关的信息,都是不得而知的,都需要你的程序来完成。这使得SAX在编程处理上没有DOM来得那么方便。 @Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);
//    开始解析根节点if (qName.equals("layer")) {currenData = new Data();currenData.setType(attributes.getType("type"));}this.tagName = localName;}//这个方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {super.characters(ch, start, length);if (tagName != null) {String da = new String(ch, start, length);if (tagName.equals("type")) {this.currenData.setType(da);} else if (tagName.equals("value")) {this.currenData.setValue(String.valueOf(da));}}}//和startDocument()方法相对应。当文档结束的时候,调用这个方法,可以在其中做一些善后的工作。@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {super.endElement(uri, localName, qName);if (localName.equals("layer")) {datas.add(currenData);currenData = null;}this.tagName = null;}
}
alue; }}

新建类SaxService实例化一个SAX解析器的工厂:SaxParserUtils

需要一个调用SAXParser对象的类,这里新建一个SaxParserUtils类,实例化SAXParserFactory用于设定XML流和解析器。代码如下:
public class SaxParserUtils {
//public static List<Data> readXML(InputStream inputStream) {try {SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser();ContenHanler handler = new ContenHanler();saxParser.parse(inputStream, handler);inputStream.close();return handler.getData();} catch (Exception e) {e.printStackTrace();}return null;}
}
这是最后一个类,用于调用方法展示数据,用Listview展示
public class MainActivity extends AppCompatActivity {InputStream inputStream;ListView lv;private List<Data> personList;private String[] str;String name;String result;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (ListView) findViewById(R.id.lv_demoe);try {inputStream = getAssets().open("data.xml");} catch (IOException e) {e.printStackTrace();}initData();lv.setAdapter(new ArrayAdapter<Data>(this,android.R.layout.simple_list_item_1, personList));}private void initData() {if (inputStream == null) {result = "inputStream is null";} else {personList = SaxParserUtils.readXML(inputStream);}}}

   当我们看下面第二张图片时,不要惊慌,因为没在Data类加toString()方法造成的。加上即可





   时间不早了,该睡觉了。
												

安卓小菜鸟重拾Java系列002.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系列之——Java面试题

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  4. 【JAVA系列】Java中的包、类的继承、多态、抽象类与接口

    文章目录 前言 一.包及访问权限 1.什么是包? 2.如何导入包? 3.JDK中常见的包 4.包的访问控制权限 二.继承 1.继承的基本概念 2.继承时方法调用顺序 3.super和this关键字 4 ...

  5. JAVA SAX解析XML字符串实例

    2019独角兽企业重金招聘Python工程师标准>>> Demo代码如下: package com.wenqi.demo;import java.io.IOException; im ...

  6. java映射文件是哪一种xml_java解析xml的几种方式哪种最好?

    满意答案 gjek59ug 2013.10.10 采纳率:52%    等级:12 已帮助:9223人 (1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组 ...

  7. java 前言中不允许有内容_解析xml字符串时报“前言中不允许有内容”错误。

    一,问题出现经过: j基于java语言webservic服务端接收客户端 传来的xml字符串用 解析时总报:org.dom4j.DocumentException: Error on line 1 o ...

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

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

  9. java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)

    GeoServer上的WCS服务发布调用及解析生成可下载为Tif的WCSUrl 2022.2.14 所用软件环境(Java.Tomcat.GeoServer.Google Browser.Eclips ...

最新文章

  1. EMAIL发送系统(C#+基于SMTP认证) 2.0
  2. Android视图动画集合AndoridViewAnimations
  3. 品牌管理案例——添加新品牌 删除品牌 根据条件筛选品牌
  4. 企业微信oauth认证_OAuth2身份认证
  5. C++ 二维数组和指针数组
  6. MySql数据库索引底层数据结构
  7. js 获取url的get传值函数
  8. 国庆前的最后3场直播活动!!
  9. Bailian4045 与3和5无关的数【进制+模除】
  10. c语言程序文件夹里没看到prj,求教。如何调用编好的函数。如何使用prj文件
  11. Markdown入门教程-不古出品
  12. linux系统安装wine关关采集,在Ubuntu 20.04系统上安装和使用Wine 5的方法
  13. Python基础之闭包函数
  14. 学习linux压缩命令压缩文档
  15. 现代企业管理笔记——领导
  16. 今日芯声 | 为学生佩戴头环监测走神,这就是传说中的“紧箍咒”?
  17. 常用的重试技术—如何优雅的重试(Spring-Retry)等
  18. 机械工业出版社 c语言程序设计教程课后题,C语言程序设计
  19. composer install 出现的问题
  20. 嵌入式分享合集137

热门文章

  1. python画七色花代码_3分钟,教你学画一朵梦中的七色花
  2. 任意进制到十进制的转换
  3. 华为云宣布全面建设全球初创生态,3年内赋能10000家高潜初创企业
  4. blueMoon (哗--)论坛自动点广告完成星成就自动道具工具
  5. HCL实验:vlanif实现VLAN互通
  6. 隆重推介:胡光超老师2022年度优秀中高项学员代表龙虎榜!
  7. 万人直播架构与CDN网络
  8. c语言 常量 指定地址,指定常量、变量、函数在存储空间的地址
  9. 知识:满月时,为什么月亮时大时小呢
  10. matlab svm auc,SVM分类后如何绘制AUC曲线