バックグラウンド:
Webサイトから情報を取得するアプリケーションに取り組んでいます。これは私が数ヶ月前に取り組んだアプリケーションで、当時はすべて問題ありませんでしたが、メンテナンスとプロジェクトの継続のために戻ってきました。
私は何を取得していますか:
ビューソース:http ://services.runescape.com/m=news/latest_news.rss
XMLを確認するには、ソースを参照してください。すべてのアイテムには、カテゴリ、リンク、pubDate、タイトル、説明、およびGUIDがあることに注意してください。そして、いくつかのアイテムだけがエンクロージャーを持っています。
問題:
すべてのタグは<tag>で始まり、</ tag>で終わります。ただし、エンクロージャーは/>で終わります。これが読み取りプロセスを台無しにしているのですが、それをどのように説明するか、または適切に形成されているかどうかはわかりません。 XML。
質問:
従来の</tag>の方法で終わらないタグを処理する方法はありますか?
以下は私がこれまでに持っているすべてのコードです-誰か質問があれば、遠慮なく質問してください。ヘルプやコメントをありがとう、stackoverflow-ersの仲間に感謝します。
処理方法:
私はSAXParserFactoryとXMLリーダーを使用しています。
try
{
/** Handling XML */
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
/** Send URL to parse XML Tags */
URL sourceUrl = new URL("http://services.runescape.com/m=news/latest_news.rss");
/**
* Create handler to handle XML Tags ( extends
* DefaultHandler )
*/
//MyXMLHandler myXMLHandler = new MyXMLHandler();
xr.setContentHandler(new MyXMLHandler());
xr.parse(new InputSource(sourceUrl.openStream()));
}
catch (Exception e)
{
e.printStackTrace();
//Log.i("EXCEPTION:","HomeActivity.java, line 121 - xml not parsed");
}
/** Get result from MyXMLHandler XMLlist Object */
newsList = MyXMLHandler.xMLList;
グローバル変数:
private XMLList newsList;
XMLListクラス:
XMLListクラスのすべてのgetメソッドからリストを取得して、ニュースの「アイテム」を表示します。
したがって、15個のアイテムがある場合、15個の日付、カテゴリ、リンクなどがあるはずですが、エンクロージャの問題があると、エンクロージャは開始されますが、終了しません。
だから私は15のタイトルを取得しますが、12の日付、12のカテゴリ、12のリンクなどしかありません。上記のrssのソースで「enclosure」という単語を検索すると(view-source:http ://services.runescape.com/m=news /latest_news.rss)、エンクロージャーを持つアイテムは3つだけです。
public class XMLList
{
/** Variables */
private ArrayList<String> title = new ArrayList<String>();
private ArrayList<String> detail = new ArrayList<String>();
private ArrayList<String> description = new ArrayList<String>();
private ArrayList<String> link = new ArrayList<String>();
private ArrayList<String> date = new ArrayList<String>();
private ArrayList<String> category = new ArrayList<String>();
/**
* In Setter method default it will return arraylist change that to add
*/
public XMLList()
{
title.clear();
detail.clear();
description.clear();
link.clear();
date.clear();
category.clear();
}
public ArrayList<String> getTitle()
{
return title;
}
public void setTitle(String name)
{
this.title.add(name);
}
public ArrayList<String> getDetail()
{
return detail;
}
public void setDetail(String detail)
{
this.detail.add(detail);
}
public ArrayList<String> getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description.add(description);
}
public void setLink(String link)
{
this.link.add(link);
}
public ArrayList<String> getLink()
{
return link;
}
public void setDate(String date)
{
this.date.add(date);
}
public ArrayList<String> getDate()
{
return date;
}
public void setCategory(String cat)
{
this.category.add(cat);
}
public ArrayList<String> getCategory()
{
return category;
}
}
MyXMLHandlerクラス:
public class MyXMLHandler extends DefaultHandler
{
public static XMLList xMLList;
Boolean currentElement = false;
String currentValue = null;
Boolean inTitle = false;
Boolean inDescription = false;
Boolean inItem = false;
Boolean inDate = false;
Boolean inLink = false;
Boolean inCategory = false;
StringBuilder buff = null;
public MyXMLHandler()
{
xMLList = new XMLList();
}
// All methods auto called in this order - start, characters, end
/*
* Called when an xml tag starts
* imgView.setImageResource(R.drawable.newImage);
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
{
if(xMLList == null)
{
xMLList = new XMLList();
}
if(localName.equals("item"))
{
inItem = true;
}
if (inItem)
{
Log.d("START " + localName,"");
if (localName.equals("title"))
{
inTitle = true;
buff = new StringBuilder();
}
if (localName.equals("description"))
{
inDescription = true;
buff = new StringBuilder();
}
if (localName.equals("link"))
{
inLink = true;
buff = new StringBuilder();
}
if (localName.equals("pubDate"))
{
inDate = true;
buff = new StringBuilder();
}
if (localName.equals("category"))
{
inCategory = true;
buff = new StringBuilder();
}
}
}
/*
* Called when an xml tag ends
*/
@Override
public void endElement(String uri, String localName, String qName)throws SAXException
{
if (inItem && !inTitle && !inDescription && !inLink && !inDate && !inCategory)
{
Log.d("END ITEM", "");
inItem = false;
}
else if (inTitle)
{
String check = buff.toString().trim();
Log.d("TITLE:", check);
Log.d("END " + localName,"");
xMLList.setTitle(check);
inTitle = false;
buff = null;
}
else if (inDescription)
{
String check = buff.toString().trim();
Log.d("DESC:", check);
Log.d("END " + localName,"");
xMLList.setDescription(check);
inDescription = false;
buff = null;
}
else if (inLink)
{
String check = buff.toString().trim();
Log.d("LINK:", check);
Log.d("END " + localName,"");
xMLList.setLink(check);
inLink = false;
buff = null;
}
else if (inDate)
{
String check = buff.toString().trim();
Log.d("DATE:", check);
Log.d("END " + localName,"");
check = check.substring(0,16);
xMLList.setDate(check);
inDate = false;
buff = null;
}
else if(inCategory)
{
String check = buff.toString().trim();
Log.d("CATEGORY:", check);
Log.d("END " + localName,"");
xMLList.setCategory(check);
inCategory = false;
buff = null;
}
}
/*
* Called to get tag characters
*/
@Override
public void characters(char[] ch, int start, int length)throws SAXException
{
if (buff != null)
{
for (int i = start; i < start + length; i++)
{
buff.append(ch[i]);
}
}
}
}