0

バックグラウンド:

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]);
        }
    }

}
}
4

1 に答える 1

1

endElementメソッドには次のものがあります。

    if (inItem && !inTitle && !inDescription && !inLink && !inDate && !inCategory)
    {
        Log.d("END ITEM", "");
        inItem = false;
    }

パーサーがタグinItemにヒットすると、これは false に設定されます。<enclosure />

inItem実際に終了タグに遭遇した場合にのみ、false に設定する必要があります。これは、"item" の</item>ヒットによって検出されます。endElementlocalname

XMLList クラスで複数のリストを使用することも非常に脆弱です。読んでいるタグに一致するフィールドを持つクラスを作成し、そのクラスのオブジェクトの単一のリストを作成する方がよいでしょう。

于 2013-03-02T19:18:04.573 に答える