Проблемы с анализом некоторых RSS-каналов с использованием Java и Sax - PullRequest
2 голосов
/ 29 мая 2010

Я написал анализатор RSS-каналов на Java (работает на Android), и он отлично разбирает некоторые каналы, а другие нет вообще. Я получаю следующую ошибку при попытке разобрать Slashdot (http://rss.slashdot.org/Slashdot/slashdot)

org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: unbound prefix

Если я попытаюсь разобрать Wired (http://feeds.wired.com/wired/index)

org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: syntax error

Если я попытаюсь разобрать AndroidGuys (http://feeds.feedburner.com/androidguyscom)

org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 0: syntax error

Вот код для моего парсера.

public void updateArticles(Context ctx, Feed feed, int numDaysToGet) {
    try {
        targetFlag = TARGET_ARTICLES;
        tweetDB = new TweetMonsterDBAdapter(ctx);
        tweetDB.open();
        currentFeed = feed;
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));  // or "Etc/GMT-1"

        Date currentDate = new Date();
        long dateInMillis = currentDate.getTime();
        oldestDate.setTime(dateInMillis-(dayInMillis*numDaysToGet));

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(this);
        xr.parse(new InputSource(currentFeed.url.openStream()));

    } catch (IOException e) {
        Log.e("TweetMonster", e.toString());
    } catch (SAXException e) {
        tweetDB.close();
        Log.e("TweetMonster", e.toString());
    } catch (ParserConfigurationException e) {
        Log.e("TweetMonster", e.toString());
    }
    tweetDB.close();
}

Это даже не входит в мой метод startElement.

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Если вы хотите устранить такие проблемы, я рекомендую распечатать ответ с сервера. Ранее я получал «ExpatParser $ ParseException: в строке 1, столбец 0: синтаксическая ошибка», когда я настроил HttpClient, чтобы он не следовал за перенаправлениями, и полученный ответ был чем-то вроде «Эта страница перемещена» вместо требуемого XML.

Вы можете сделать что-то вроде:

BufferedReader br = new BufferedReader(new InputStreamReader(currentFeed.url.openStream()));
String str = null;

while ((str = br.readLine()) != null) 
   System.out.println(str);

просто чтобы посмотреть, каков на самом деле ответ.

1 голос
/ 22 марта 2011

В случае, если это помогает другим, у меня тоже появлялось точно такое же сообщение об ошибке из порта iPhone на Android, и это было просто потому, что в XML отсутствовала строка объявления в верхней части XML для незарегистрированного типа.

например. для тега типа blah, найденного где-то в XML, например

<blah:abc>content</blah:abc>

нам нужно что-то вроде следующего ...

<parentelement xmlns:blah="http://www.blah.com/dtds/blah.dtd" version="2.0" >
   <blah:abc>content</blah:abc>
</parentelement>

Если он находится во внешнем RSS-канале, вы не можете контролировать его содержимое, можете прочитать содержимое файла и добавить соответствующий отсутствующий текст, прежде чем запускать его через анализатор, как обычно, а также связаться с производителем RSS, чтобы попросить их соответствовать стандарту .

...