SAX解析XML时遇到2个纠结的问题
最近使用SAX解析xml时,遇到了2个头疼的问题,经过一番调试,终于解决了。
第一个问题:重写public void characters(char[] ch, int start, int length)方法时, 通常我们会认为char[]数组就是xml element的值,但是
经常会出现1个元素会触发两个方法事件,就是说element的值可能会分别处于2个不同的char数组中, 若直接在返回char[]给对应的对象变量,则会
造成数据丢失。 我就碰到了一个存放图片url的element的值数据丢失,在下载图片时出错了,才发现了这个问题。
解决方法:就是不会直接在这个方法中将char[]值返回, 通常我们应该建一个全局的StringBuffer对象,将char数组转为字符串加入StringBuffer对象,
这样就会当前元素开始标签事件public void startElement(String uri, String localName, String qName, Attributes attributes), 与element结束标签
事件public void endElement(String uri, String localName, String qName)之间的所有字符全部捕捉, 在endElment时返回。
第二个问题, 其实是第一个问题的延续。 因为在处理element值时使用了全局变量StringBuffer对象,所以还要使用一个全局变量elementName来判断
当前元素的名字,通常在startElement中将变量值设为当前元素的名字, 然后在endElement方法中根据elementName将element值返回给对应的位置。 要
注意的就是,最后一个element之后,还会有个根节点或element的父节点, 根节点和父节点通常不会有值,但是会startElement和endElement事件,会将
最后一个元素的值重新设为空,造成数据丢失。
解决犯法就是在endElement中最后最后一行将 elementName设为空置, 将StringBuffer的对象清空。 保证在一个元素的所有事件触发后,将elementName
和值设为初始状态。
总结, 我们在开始的时候应该对象和业务的生命周期,并在生命周期结束后将其复原。