При разборе RSS-канала через Рим получение контента в прологе запрещено - PullRequest
1 голос
/ 12 декабря 2011

Используя Rome API для разбора RSS-каналов, я получаю эту ошибку:

com.sun.syndication.io.ParsingFeedException: Invalid XML
    at com.sun.syndication.io.WireFeedInput.build(WireFeedInput.java:210)

Код следующий:

public static void main(String[] args) {
    URL url;
    XmlReader reader = null;
    SyndFeed feed; 

    try {
        url = new URL("https://www.democracynow.org/podcast.xml");
        reader = new XmlReader(url);
        feed = new SyndFeedInput().build(reader);
        for (Iterator<SyndEntry> i =feed.getEntries().iterator(); i.hasNext();) {
            SyndEntry entry = i.next();
            System.out.println(entry.getPublishedDate()+" Title  "+entry.getTitle());

        }
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

Я проверил некоторые ссылки, такие как:

http://old.nabble.com/Invalid-XML:-Error-on-line-1:-Content-is-not-allowed-in-prolog.-td21258868.html

Где проблема, по-видимому, связана с кодировками, но я не мог придумать, как это реализовать. Любая помощь или руководство будет очень признателен.

Спасибо и всего наилучшего,

Вайбхав Госвами

Ответы [ 3 ]

1 голос
/ 19 марта 2012

Я также использую Синдикацию и могу получить дату и название публикации.

Мой код выглядит следующим образом:

URL feedUrl = new URL("http://www.bloomberg.com/tvradio/podcast/cat_markets.xml");

SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(feedUrl));

for (Iterator i = feed.getEntries().iterator(); i.hasNext();)
{
SyndEntry entry = (SyndEntry) i.next();
System.out.println("title |"+entry.getTitle()+"   " -timeStamp "+entry.getPublishedDate()"\n")
}

Это работает, и я использовал URL Bloombergпросто потому, что он дает мне XML.

Если ваш запрос был чем-то другим, дайте мне знать :)

0 голосов
/ 28 января 2013

Это связано с проблемой Mark Byte Order Mark .Вот тестовый пример JUnit, который демонстрирует проблему и исправление:

package rss;

import org.xml.sax.InputSource;

import java.io.*;
import java.net.*;

import com.sun.syndication.io.*;

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.BOMInputStream;
import org.junit.Test;

public class RssEncodingTest {

    String url = "http://www.moneydj.com/KMDJ/RssCenter.aspx?svc=NH&fno=1&arg=X0000000";

    // This works because we use InputSource direct from the UrlConnection's InputStream

    @Test
    public void test01() throws MalformedURLException, IOException,
            IllegalArgumentException, FeedException {
        try (InputStream is = new URL(url).openConnection().getInputStream()) {
            InputSource source = new InputSource(is);
            System.out.println("description: "
                    + new SyndFeedInput().build(source).getDescription());
        }
    }

    // But a String input fails because the byte order mark problem

    @Test
    public void test02() throws MalformedURLException, IOException,
            IllegalArgumentException, FeedException {
        String html = IOUtils.toString(new URL(url).openConnection()
                .getInputStream());
        Reader reader = new StringReader(html);
        System.out.println("description: "
                + new SyndFeedInput().build(reader).getDescription());
    }

    // We can use Apache Commons IO to fix the byte order mark

    @Test
    public void test03() throws MalformedURLException, IOException,
            IllegalArgumentException, FeedException {
        String html = IOUtils.toString(new URL(url).openConnection()
                .getInputStream());
        try (BOMInputStream bomIn = new BOMInputStream(
                IOUtils.toInputStream(html))) {
            String f = IOUtils.toString(bomIn);
            Reader reader = new StringReader(f);
            System.out.println("description: "
                    + new SyndFeedInput().build(reader).getDescription());
        }
    }

}
0 голосов
/ 04 мая 2012

вы можете использовать SyndFeed и SyndEntry для анализа xml

Также вам необходимо проверить, является ли xml действительным

URL url  = new URL("http://feeds.feedburner.com/javatipsfeed");
    XmlReader reader = null;
    try {
      reader = new XmlReader(url);
      SyndFeed feeder = new SyndFeedInput().build(reader);
      System.out.println("Feed Title: "+ feeder.getAuthor());
      for (Iterator i = feeder.getEntries().iterator(); i.hasNext();) {
        SyndEntry syndEntry = (SyndEntry) i.next();
        System.out.println(syndEntry.getTitle());
      }
      } finally {
            if (reader != null)
                reader.close();
      }
...