SAX解析,对一个tag为啥执行三次 character()方法?

JavaMan 2011-06-19 08:44:29
一个简单的xML , 如下:
<students>
<student>
<id>1</id>
<name>Tom</name>
<sex>M</sex>
<age>22</age>
</student>
</students>
复写的characters()方法,截取如下:
public void characters(char[] ch, int start, int length)throws SAXException {
if(tgName.equals("id")){//为何在进入<id>标签后,该if语句会被执行三次呢?其中tgName变量是在startElement()方法中赋值的。
tmp=new String(ch,start,length);
id=tmp;
System.out.println("From characters id="+id);
}
……
注:
经Debug三次所取得的内容分别为:
1
\n
\t
还请牛人指教,谢谢!
...全文
685 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
RyaniL 2013-08-26
  • 打赏
  • 举报
回复
原来句号后面有个回车符,将回车去掉就行了:.replace("\n", "")
RyaniL 2013-08-24
  • 打赏
  • 举报
回复
我也是啊。。。。 <string> 穿衣指数:热,适合穿T恤、短薄外套等夏季服装。 过敏指数:易发,应减少外出,外出需采取防护措施。 运动指数:较不宜,有较强降水,请在室内进行休闲运动。 洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。 晾晒指数:不宜,有较强降水会淋湿衣物,不适宜晾晒。 旅游指数:较不宜,有强降雨,建议您最好还是在室内活动。 路况指数:湿滑,路面湿滑,车辆易打滑,减慢车速。 舒适度指数:较舒适,白天降雨,有些热。 空气污染指数:良,气象条件有利于空气污染物扩散。 紫外线指数:弱,辐射较弱,涂擦SPF12-15、PA+护肤品。 </string> 这个被解析成: 穿衣指数:热,适合穿T恤、短薄外套等夏季服装。 过敏指数:易发,应减少外出,外出需采取防护措施。 运动指数:较不宜,有较强降水,请在室内进行休闲运动。 洗车指数:不宜,有雨,雨水和泥水会弄脏爱车。 晾晒指数:不宜,有较强降水会淋湿衣物,不适宜晾晒。 旅游指数:较不宜,有强降雨,建议您最好还是在室内活动。 路况指数:湿滑,路面湿滑,车辆易打滑,减慢车速。 舒适度指数:较舒适,白天降雨,有些热。 空气污染指数:良,气象条件有利于空气污染物扩散。 紫外线指数:弱,辐射较弱,涂擦SPF12-15、PA+护肤品。 每行都是单独的字符串,是不是遇到空格就调用Character()?
ttdevs 2013-04-13
  • 打赏
  • 举报
回复
我也遇到这诡异的问题
aliasqs 2013-03-14
  • 打赏
  • 举报
回复
好早的帖子 但是有点帮助啊
zjbbxy 2011-09-30
  • 打赏
  • 举报
回复
刚才试了一下,确实character()在读字符串时会读多次,情况如下:
遇到特殊字符,例如\n,\r等;
遇到内存清理时(一般情况下缓存都是4K,所以如果数据量较大,4K的时候就会发生错误)。
Caffery Chen 2011-07-18
  • 打赏
  • 举报
回复
楼主你看一下传进来的xml文件流(打印一下inputstream收到的东西。)到底是什么样的结构。
JavaMan 2011-07-08
  • 打赏
  • 举报
回复
再留两天,没有中意的回复也要结贴了。
撸Java源码 2011-06-27
  • 打赏
  • 举报
回复
很好。
JavaMan 2011-06-26
  • 打赏
  • 举报
回复
每天都 来盖一层。
JavaMan 2011-06-24
  • 打赏
  • 举报
回复
Receive notification of character data inside an element.
API这样解释。我的element就是<id>1<id>这样写的啊。
看来是XML文档的问题。
wupengyu120 2011-06-24
  • 打赏
  • 举报
回复
回车是当前行的末尾字符。
\t 是下一行的行头空格。应该是你的xml文件第二行用Tab键缩进了。
在SAX看来这些都是内容,要执行characters方法的。
android_study2011 2011-06-24
  • 打赏
  • 举报
回复
所以你增加一个成员变量,StringBuilder,
每次characters就Append进去

来自 android.growprogress.com
JavaMan 2011-06-24
  • 打赏
  • 举报
回复
每天来一次,看有没有收获。
JavaMan 2011-06-23
  • 打赏
  • 举报
回复
恩,有可能。
姑且这么认为,先试试看。谢谢关注。
njnu06030609 2011-06-22
  • 打赏
  • 举报
回复
可能你的xml文件<id>1</id>开始的时候被你写成
<id>
1
</id>
这样了,其实空格回车在解析的时候都会被当做内容。
zhouYunan2010 2011-06-21
  • 打赏
  • 举报
回复
回车,\t,和内容值都会触发characters方法
JavaMan 2011-06-20
  • 打赏
  • 举报
回复
难道这个问题,太弱智了吗?
JavaMan 2011-06-20
  • 打赏
  • 举报
回复
我比较疑惑的是 ,为什么会 解析出来 \n \t呢?
JavaMan 2011-06-20
  • 打赏
  • 举报
回复
感谢关注。
<id>1</id>不光解析这个三次,每个标签中的内容都是三次,不多不少。
第一次是 内容\
第二次是 \n
第三次是 \t
个人感觉是不是有什么东西,我没有处理啊。还望牛人赐教。
JavaMan 2011-06-20
  • 打赏
  • 举报
回复
哦,可是我的那个id标签里面很简单啊。
加载更多回复(4)
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double  引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 7、String 和StringBuffer的区别  JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。 8、运行时异常与一般异常有何异同?  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 10、说出ArrayList,Vector, LinkedList的存储性能和特性  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Ses

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧