4

次のURLを使用して、Androidv.17上のMonsterからのRSSフィードを解析しようとしています。

http://rss.jobsearch.monster.com/rssquery.ashx?q=java

コンテンツを取得するには、次の方法でHttpUrlConnectionを使用しています

this.conn = (HttpURLConnection) url.openConnection();
this.conn.setConnectTimeout(5000);
this.conn.setReadTimeout(10000);
this.conn.setUseCaches(true);
conn.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
is = new InputStreamReader(url.openStream());

戻ってくるのは、私が言える限り(そして私もそれを検証した)合法的なRSSです

Cache-Control:private
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:5958
Content-Type:text/xml
Date:Wed, 06 Mar 2013 17:15:20 GMT
P3P:CP=CAO DSP COR CURa ADMa DEVa IVAo IVDo CONo HISa TELo PSAo PSDo DELa PUBi BUS LEG PHY ONL UNI PUR COM NAV INT DEM CNT STA HEA PRE GOV OTC
Server:Microsoft-IIS/7.5
Vary:Accept-Encoding
X-AspNet-Version:2.0.50727
X-Powered-By:ASP.NET

これは次のように始まります(完全なXMLを表示するには、上のURLをクリックしてください)。

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Monster Job Search Results java</title>
    <description>RSS Feed for Monster Job Search</description>
    <link>http://rss.jobsearch.monster.com/rssquery.ashx?q=java</link>

しかし、私がそれを解析しようとすると:

final XmlPullParser xpp = getPullParser();
xpp.setInput(is);
for (int type = xpp.getEventType(); type != XmlPullParser.END_DOCUMENT; type = xpp.next()) { /* pasing goes here */ }

コードはすぐtype = xpp.next()に次の例外でチョークします

03-06 09:27:27.796: E/AbsXmlResultParser(13363): org.xmlpull.v1.XmlPullParserException: 
   Unexpected token (position:TEXT @1:2 in java.io.InputStreamReader@414b4538) 

これは、実際には1行目の2番目の文字を処理できないことを意味します<?xml version="1.0" encoding="utf-8"?>

KXmlParser.java(425-426)の問題のある行は次のとおりです。タイプ==TEXTは次のように評価されますtrue

if (depth == 0 && (type == ENTITY_REF || type == TEXT || type == CDSECT)) {
    throw new XmlPullParserException("Unexpected token", this, null);
}

何か助けはありますか?パーサーをに設定しようとしましXmlPullParser.FEATURE_PROCESS_DOCDECL = falseたが、それは役に立ちませんでした

私はこれをウェブとここで調査しましたが、役立つものは何も見つかりません

4

1 に答える 1

34

エラーが発生する理由は、xmlファイルが実際にはで始まっていないためです<?xml version="1.0" encoding="utf-8"?>。それはである3つの特別なバイトEF BB BFで始まりますByte order mark

16進表現

InputStreamReaderこれらのバイトは自動的に処理されないため、手動で処理する必要があります。それへの最も簡単な方法は、ライブラリで利用BOMInpustStream可能なものを使用することです。Commons IO

this.conn = (HttpURLConnection) url.openConnection();
this.conn.setConnectTimeout(5000);
this.conn.setReadTimeout(10000);
this.conn.setUseCaches(true);
conn.addRequestProperty("Content-Type", "text/xml; charset=utf-8");
is = new InputStreamReader(new BOMInputStream(conn.getInputStream(), false, ByteOrderMark.UTF_8));  

上記のコードを確認しましたが、うまく機能しています。

于 2013-03-10T05:59:42.130 に答える