Java 我的解析器跳过元素

Java 我的解析器跳过元素,java,android,xml,Java,Android,Xml,我正在尝试制作一个RSS阅读器,它使用来自web的XML。出于某种原因,它只读取最后一个元素 这几乎就是XML文件: <rss version="2.0"> <channel> <item> <mainTitle>...</mainTitle> <headline> <title>...</title&g

我正在尝试制作一个RSS阅读器,它使用来自web的XML。出于某种原因,它只读取最后一个元素

这几乎就是XML文件:

<rss version="2.0">
    <channel>
        <item>
            <mainTitle>...</mainTitle>
            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>

            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>
        </item>

        <item>
            <mainTitle>...</mainTitle>
            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>

            <headline>
                <title>...</title>
                <description>...</description>
                <subTitle>...</subTitle>
                <link>...</link>
            </headline>
        </item>
    </channel>
</rss>

...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
这是解析器:

公共类RssHandler扩展了DefaultHandler{
//用于临时存储的提要和文章对象
私人物品currentArticle=新物品();
private List articleList=新建ArrayList();
//迄今为止添加的文章数
私有int articlesAdded=0;
//要下载的文章数
私有静态最终整数限制=20;
//正在累积的当前字符
StringBuffer chars=新的StringBuffer();
//正在累积的当前字符
int cap=new StringBuffer().capacity();
//基本布尔
私有布尔wantedItem=false;
私有布尔wantedHeadline=false;
私有布尔wantedTitle=false;
公共列表getArticleList(){
退货清单;
}
公共文章getParsedData(){
返回此.currentArticle;
}
公共图书馆{
this.currentArticle=新文章();
}
public void startElement(字符串uri、字符串localName、字符串qName、,
属性(atts){
chars=新的StringBuffer();
}
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
if(localName.equalsIgnoreCase(“标题”)){
currentArticle.setTitle(chars.toString());
}else if(localName.equalsIgnoreCase(“副标题”)){
currentArticle.setDescription(chars.toString());
}else if(localName.equalsIgnoreCase(“pubdate”)){
currentArticle.setPubDate(chars.toString());
}else if(localName.equalsIgnoreCase(“guid”)){
currentArticle.setGuid(chars.toString());
}else if(localName.equalsIgnoreCase(“作者”)){
currentArticle.setAuthor(chars.toString());
}else if(localName.equalsIgnoreCase(“链接”)){
currentArticle.setEncodedContent(chars.toString());
}else if(localName.equalsIgnoreCase(“项”))
//检查是否正在查找文章,以及文章是否完整
if(localName.equalsIgnoreCase(“项”)){
articleList.add(当前文章);
currentArticle=新文章();
//让我们看看我们是否达到了文章数量的限制
articlesAdded++;
如果(articlesAdded>=物品限制){
抛出新的SAXException();
}
}
字符集长度(0);
}
公共无效字符(字符ch[],整数开始,整数长度){
附加字符(ch、开始、长度);
}
}
每当我调试应用程序时,qName从来都不是项的直接子项

它读rss->channel->item->title->description

我不懂。请帮忙

1)在endElement()方法的末尾,您没有重置字符长度,即

   public void endElement(String uri, String localName, String qName)
        throws SAXException {

    //...           
    //Reset 'chars' length at the end always.
    chars.setLength(0);
    }
2) 更改字符(…)方法,如下所示:

    public void characters(char ch[], int start, int length) {
        chars.append(ch, start, length);
    }
[编辑

3) 将“chars”的初始化从“startElement”移动到构造函数。即:

public RssHandler() {
    this.currentArticle = new Article();
    //Add here..
    chars = new StringBuffer();
}
以及

4) 最后,使用qName检查匹配的标记,而不是localName,即

    if (qName.equalsIgnoreCase("title")) {
        currentArticle.setTitle(chars.toString().trim());
    } else if (qName.equalsIgnoreCase("subtitle")) {
        currentArticle.setDescription(chars.toString().trim());
    } //... 
编辑]


更多信息@

谢谢!我改变了这一点,但主要的问题仍然存在,因为它无法识别标签,所以它只发布每个标签的最后一篇文章。它会用最后一个标题(在本例中为最后一个标题)重写每个标题/副标题/发布日期等。请检查已应用遗漏修复的编辑答案
    if (qName.equalsIgnoreCase("title")) {
        currentArticle.setTitle(chars.toString().trim());
    } else if (qName.equalsIgnoreCase("subtitle")) {
        currentArticle.setDescription(chars.toString().trim());
    } //...