Frage

Ich versuche, einen Feed -Aggregator zu erstellen, indem ich verwendet wird Rom (1.0). Alles funktioniert, aber ich habe Probleme mit Feeds Charset. Ich entwickle es mit Java 1.6 über einen Mac OS X (NetBeans 6.9.1).

Ich verwende den folgenden Code, um Feeds abzurufen:

InputStream is = new URL(_source).openConnection().getInputStream();
SyndFeed feed = (SyndFeed) input.build(new InputStreamReader(is, Charset.forName(_charset)));

Wo _source ist eine RSS -Quelle (wie http://rs.cnn.com/rss/edition.rss) und _charset ist UTF-8 oder ISO-8859-1.

Es funktioniert, aber einige Websites mit lateinischen Charakteren (wie Portugiesisch) nicht, wenn ich beide Codierungen verwende.

Zum Beispiel Feeds lesen aus http://oglobo.globo.com/rss/plantaopais.xml wird immer Dummy -Charaktere wie folgt zurückgeben:

Secret�rio de S�o Paulo (UTF-8)
Geheimnis (ISO-8859-1)

Wieso den? Vermisse ich etwas?

Wenn ich versuche, so etwas wie UTF-16 zu verwenden, wirft Rom einen Fehler aus: com.sun.syndication.io.ParsingFeedException: Ungültiger XML: Fehler in Zeile 1: Inhalt ist in Prolog nicht zulässig.

Ich habe andere Kodierungen ausprobiert, wie US-Ascii ohne Glück ...

Eine andere Frage: Ist Rom die beste Lösung für die Bewältigung von Feeds (mit Java)? Die jüngste Version von Rom ist 1.0, die aus dem Jahr 2009 datiert ist. Es scheint tot zu sein ...

Tia,

Bob

War es hilfreich?

Lösung

Ich weiß nicht Rom (Sie hätten einen Link in Ihre Frage setzen können). ISO-8859-1 sollte die richtige Kodierung für den von Ihnen verlinkten Feed sein. Aber Ihre Bibliothek unterstützt nicht eine InputStream Als Quelle (so würde es selbst die richtige Kodierung der XML -Präambel nachschlagen)?

Könnte es sein, dass die Ausgabe nach der Verarbeitung durch die Ausgabe Ihres Programms verstümmelt ist? Könnten Sie schreiben

System.out.println("S\u00e3o Paulo");

in Ihrem Programm und melden Sie seine Ausgabe? (Es sollte "São Paulo" sein, wenn Ihre Java + -Konsole -Kombination richtig konfiguriert ist.)


Also habe ich jetzt Rom heruntergeladen und zusammengestellt (das eine halbe Stunde lang andere Dinge von Maven heruntergeladen hat), und ich kann das Problem reproduzieren. Sieht aus wie das build Die Methode, die einen Leser aufnimmt, hat Probleme.

Hier ist eine Variante, die funktioniert (wenn Rom, Jdom und Xerces im Klassenpfad sind):

package de.fencing_game.paul.examples.rome;

import org.xml.sax.InputSource;

import java.nio.charset.Charset;
import java.io.*;
import java.net.*;

import com.sun.syndication.io.*;
import com.sun.syndication.feed.synd.*;

public class RomeTest {

    public static void main(String[] ignored)
        throws IOException, FeedException
    {
        String charset = "UTF-8";
        String url = "http://oglobo.globo.com/rss/plantaopais.xml";


        InputStream is = new URL(url).openConnection().getInputStream();
        InputSource source = new InputSource(is);

        SyndFeedInput input = new SyndFeedInput();
        SyndFeed feed = input.build(source);

        System.out.println("description: " + feed.getDescription());
    }


}

Durch Verwendung eines InputSource mit einem InputStream anstelle einer Reader, Der Parser selbst findet das richtige Charset und macht es richtig.


Ein bisschen in der Quelle herumzugraben, scheint unser Syndfeed den Leser oder die InputSource an JDOM zu übergeben, was ihn wiederum an den SAX XMLReader übergibt, was zu verwirrt zu sein scheint, wenn er mit einem Leser konfrontiert wird, der sich mit präsentiert <?xml ... encoding="ISO-8859-1" ?>. Ich habe dann in der Quelle von Xerces herumgegraben (die hier verwendet zu sein scheinen), fand aber nichts Verdächtiges, was dies verursachen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top