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