Java sax解析器stringbuilder仅返回一行
我尝试使用StringBuilder命名的对象,但仍然无法从描述标记中获取所有CDATA 基本上,它只在一行上获取CDATA: img是: alt=“Ocmulgee文物径剪彩”>Java sax解析器stringbuilder仅返回一行,java,xml-parsing,sax,saxparser,rss-reader,Java,Xml Parsing,Sax,Saxparser,Rss Reader,我尝试使用StringBuilder命名的对象,但仍然无法从描述标记中获取所有CDATA 基本上,它只在一行上获取CDATA: img是: alt=“Ocmulgee文物径剪彩”> package com.example.ovations\u proj; 导入java.io.ByteArrayInputStream; 导入java.util.ArrayList; 导入java.util.List; 导入java.util.StringTokenizer; 导入org.xml.sax.Attrib
package com.example.ovations\u proj;
导入java.io.ByteArrayInputStream;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.StringTokenizer;
导入org.xml.sax.Attributes;
导入org.xml.sax.SAXException;
导入org.xml.sax.helpers.DefaultHandler;
导入android.util.Log;
导入com.example.ovations_proj.RssItem;
公共类RssParseHandler扩展了DefaultHandler{
私有列表站点;
//用于在分析时引用项
私有RssItem当前项;
//解析标题指示符
私有布尔parsingtile;
//解析链接指示符
私有布尔parsingLink;
私有布尔parsingDes;
StringBuilder obj;
公共RssParseHandler(){
rssItems=newarraylist();
}
公共列表getItems(){
返回rssItems;
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{
System.out.println(“起始元素:+qName”);
if(“item”.equals(qName)){//item
currentItem=new RssItem();
}else if(“description”.equals(qName)){//description
obj=新的StringBuilder();
帕辛德斯=真;
}
}
@凌驾
public void endElement(字符串uri、字符串localName、字符串qName)引发SAXException{
System.out.println(“结束元素:+qName”);
如果(“项”。等于(qName)){
rssItems.add(currentItem);//项
currentItem=null;
}else if(“description”.equals(qName)){//description
字符串fulltext=obj.toString();
System.out.println(“全文数据:“+theFullText”);
帕辛德斯=假;
}
}
@凌驾
公共无效字符(char[]ch,int start,int length)引发异常{
if(parsingtille){
如果(currentItem!=null){
currentItem.setTitle(新字符串(ch,start,length));
}
}else如果(parsingDes){
如果(currentItem!=null&&obj!=null){
对象附加(ch、开始、长度);
帕辛德斯=假;
}
}
}
}
这可能是因为您没有正确实现characters方法,请参阅:
解析器不需要返回任何特定数量的字符
曾经。解析器可以同时从单个字符返回任何内容
时间长达几千年,仍然是一个标准
实施因此,如果应用程序需要处理字符
可以看出,让characters()方法累积
仅当
你肯定他们都找到了
您的代码假设您在一次调用中获得一个元素的全部文本,但这不能保证。characters方法需要将找到的文本累加到
StringBuffer
(或StringBuilder或其他数据结构)中,但关于如何处理累加文本的决定需要在其他地方,例如在endElement
方法中。看起来您在characters方法中过早地设置了一个标志,并导致其余文本丢失。下面是代码将其搞乱的原因。我的parsingDes标志只导致一次追加
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (parsingTitle) {
if (currentItem != null){
currentItem.setTitle(new String(ch, start, length));
}
} else if (parsingLink) {
if (currentItem != null) {
currentItem.setLink(new String(ch, start, length));
parsingLink = false;
}
} else if (parsingDes) {
if (currentItem != null){// && obj!=null ) {
obj.append(ch, start, length);
//parsingDes = false;
}
}
我还是有点困惑。我是如何错误地使用StringBuffer的?@user2230114:可以多次调用字符,您可能在一次调用中得到字符串的第一部分,在另一次调用中得到字符串的第二部分。因此,如果你在得到一些东西的基础上设置了标志,那么你可能会失去剩下的东西。添加一个调试行,打印出在characters方法中得到的内容。谢谢,Nathan解决了这个问题。
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (parsingTitle) {
if (currentItem != null){
currentItem.setTitle(new String(ch, start, length));
}
} else if (parsingLink) {
if (currentItem != null) {
currentItem.setLink(new String(ch, start, length));
parsingLink = false;
}
} else if (parsingDes) {
if (currentItem != null){// && obj!=null ) {
obj.append(ch, start, length);
//parsingDes = false;
}
}