Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java sax解析器stringbuilder仅返回一行_Java_Xml Parsing_Sax_Saxparser_Rss Reader - Fatal编程技术网

Java sax解析器stringbuilder仅返回一行

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

我尝试使用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.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;
        }
    }