XML aus einer URL im Internet lesen (JDOM)

Belushi

Mitglied
Hallo zusammen,

ich möchte einige Daten aus link entnehmen. Im Forum habe ich mit JDOM ein interessanten Lösungsvorschlag gefunden: link. Das wollte ich mal ausprobieren. Wenn ich die XML-Datei lokal (im gespeicherten Zustand im Dateisystem) auslese funktionierts, über eine URL erhalte ich diese Exception:
Java:
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 2 von 4-Byte-UTF-8-Sequenz.
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:473)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1750)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(XMLEntityScanner.java:1071)
	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:935)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanAttribute(XMLNSDocumentScannerImpl.java:436)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:253)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
	at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
	at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:277)
	at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1141)
	at reader.Reader.main(Reader.java:24)

Das ist mein Java Code:
Java:
package reader;

import java.io.IOException;
import java.net.URL;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class Reader {


	public static void main(String[] args) {

		try {
			
			URL url = new URL("http://www.google.com/ig/api?weather=berlin&hl=de");
			Document document = null;
			SAXBuilder builder = new SAXBuilder();

				try {
					document = builder.build(url);
//					document = builder.build(new File("/home/spree/Arbeitsfläche/wetter.xml"));
				} catch (JDOMException e) {
					System.out.println("Fehler");
					e.printStackTrace();
				}

				
		Element root = document.getRootElement();
		System.out.println(root.getName());

		List<Element> list = root.getChildren();
		Element el=root.getChild("weather");
		
		List <Element> el2=el.getChildren();
		
		for (Element a : el2) {
			System.out.println(a);
		}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Danke im Voraus...
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Das Encoding des XML-Responses der google weather api ist abhängig von der angeforderten Sprache (bei Dir "de"). Es ist leider nicht UTF-8, sondern irgendwas ISO-... (in Westeuropa wird häufig ISO 8859-1 verwendet.) Für das Problem gibt es zwei Lösungsalternativen

Entweder: Nutze das richtige Encoding
Leider gibt google das verwendete Encoding nicht im xml-Prolog an, sodass es nicht so leicht rauszufinden ist. Du musst Dir den Response-Header anschauen. Dort ist das encoding definiert. Benutze dafür entweder ein Firefox-Plugin, Wireshark o.ä.

Oder: Fordere explizit UTF-8 an
Was wohl auch geht, ist das Encoding explizit anzufordern. Hänge dazu folgenden Query-Parameter an die URL an:
Code:
[B]&oe=utf-8[/B]
 
Zuletzt bearbeitet von einem Moderator:

Belushi

Mitglied
Der zweite Vorschlag hat direkt funktioniert, danke

Java:
 url = new URL("http://www.google.com/ig/api?weather=berlin&hl=de&oe=utf-8");

Zum ersten Vorschlag:
das Encoding habe ich durch das Abspeichern des XMLs und anschließendem Öffnen mit einem Texteditor abgelesen. Im Prolog des XML-Dokuments steht folgende Deklaration:

[XML]<?xml version="1.0" encoding="UTF-8"?>
<xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0"><forecast_information><city data="Berlin, Berlin"/><postal_code data="berlin"/><latitude_e6 data=""
.....[/XML]

Es ist also UTF-8 Kodiert und nicht ISO-8859-1. Weshalb es dennoch nicht funktioniert hat, ist mir eigentlich immer noch ein Rätsel. Hätte das Dokument eine andere Kodierung, was hätte ich eigentlich tun müssen. Wie passe ich meinen Code an unterschiedliche Kodierungen an?
 
N

nillehammer

Gast
Belushi hat gesagt.:
Es ist also UTF-8 Kodiert und nicht ISO-8859-1. Weshalb es dennoch nicht funktioniert hat, ist mir eigentlich immer noch ein Rätsel.
Hast Recht, ich habe gerade das XML nochmal abgerufen (den ursprünglichen Link ohne utf-8-Parameter) und mir den Response-Header angeschaut. Da steht tasächlich UTF-8 drinnen.
Code:
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
Content-Type: text/xml; charset=UTF-8
...
Würde fast sagen, dass goolge da einen Fehler gemacht hat :reflect:
 
N

nillehammer

Gast
Hätte das Dokument eine andere Kodierung, was hätte ich eigentlich tun müssen. Wie passe ich meinen Code an unterschiedliche Kodierungen an?
Der
Code:
org.jdom2.input.SAXBuilder
hat noch mehr build()-Methoden, um ein
Code:
org.jdom2.Document
zu erzeugen. Unter anderem auch eine, der ein Reader als Parameter übergeben werden kann.
Java:
	public static void main(final String[] args ) throws Throwable {

		final URL weatherUrl = new URL(
				"http://www.google.com/ig/api?weather=berlin&hl=de");

		/*
		 * Mit HttpURLConnection kann man viel http-spezifischen Kram machen.
		 * Z.B. HTTP-Response -Code, -Headers -ErrorStream etc. benutzen.
		 * (Machen wir hier aber nicht)
		 */
		final HttpURLConnection weatherConnection = (HttpURLConnection) weatherUrl
				.openConnection();

		/* 
		 * Hier wird einem InputStreamReader ein CharacterSet übergeben.
		 * Der BufferedReader kann als Parameter für
		 * org.jdom2.input.SAXBuilder.build(...) als Parameter verwendet werden.
		 */
		final BufferedReader weatherReader = new BufferedReader(
				new InputStreamReader(weatherConnection.getInputStream(), "ISO-8859-1"));

		String line = null;
		while ((line = weatherReader.readLine()) != null) {

			System.out.println(line);
		}
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
M Layout + Inhalt einer JTable speichern XML & JSON 30
J Welche Gründe führen zu einer endlos tiefen XML? XML & JSON 4
T Pfad in einer Variablen speichern XML & JSON 1
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
T Visualisierung von XML Dateien in einer Java SwingGui XML & JSON 11
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
B 2 Attribute in einer xsl XML & JSON 2
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
T Schreiben einer XML XML & JSON 8
B XML auf Basis einer DTD erstellen XML & JSON 2
hdi Probleme beim Erstellen einer XML XML & JSON 7
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
S Probleme beim erstellen einer Jar XML & JSON 12
J Problem mit compile einer XSD XML & JSON 3
S Einlesen einer xml Datei XML & JSON 4
F hilfe bei einer aufgabe XML & JSON 3
D Anzahl der Knoten in einer XML XML & JSON 6
R Parsen einer XML ohne Validierung XML & JSON 2
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
cybermat Ergebnis einer XSLT-Tansformation als Rückgabewert erhalten XML & JSON 4
J Fehler beim laden einer .xml XML & JSON 3
ven000m Übungsaufgabe: Valide und gültige XML Datei zu einer DTD XML & JSON 7
A Auslesen einer XML Datei XML & JSON 58
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
Z Erzeugung einer Referenz von Knoten in JTree auf DOMTree XML & JSON 3
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4
MiMa Verfahrensweise Daten aus dem Internet abfragen XML & JSON 44
N XML File aus Internet korrekt mit absätzen formatiert abspeichern XML & JSON 10
B Klassen mit generischen Attributen mit Jackson lesen XML & JSON 4
H XMLConfiguration(1.10)/getString : Wert "E" aus <version type="Auto">E</version>n lesen XML & JSON 15
C einfach XML lesen XML & JSON 4
JBoby Yaml File lesen und in Objekte umwandel (SnakeYAML / YamlBeans) XML & JSON 0
E Einzelne Tags der context.xml lesen XML & JSON 1
W Json von URL Lesen (mit Gson Library) XML & JSON 3
W Json von URL Lesen XML & JSON 2
G Jsoup Daten lesen XML & JSON 0
F KindElemente lesen und begrenzen XML & JSON 0
P Bestimmte XML-Inhalte in String lesen XML & JSON 2
P Komfortabel XML Dokumente schreiben und lesen XML & JSON 6
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
S XML lesen und schreiben XML & JSON 2
Q Atom/RSS-Feed lesen - per XSD zu Java-Code XML & JSON 4
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
O PDF mit Pdfbox lesen XML & JSON 3
S XMLStreamReader, letzten eintrag eines xml lesen? XML & JSON 5
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
Mike90 Daten aus DB in ExcelTabelle lesen + bearbeiten + formatieren XML & JSON 2
Mike90 -xlsx Dateien in Java lesen XML & JSON 3
Fadi .classpath(XML) mit Java lesen XML & JSON 2
J Problem beim XML-Lesen XML & JSON 2
J Logdaten als XML speichern und lesen XML & JSON 2
J XML lesen schreiben XML & JSON 7
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
T Xml lesen und in .txt zeilenweise schreiben XML & JSON 4
L Einfaches XML Lesen und Schreiben XML & JSON 4
C SAX Probleme beim lesen XML & JSON 4
O OpenDocument-Tabelle mit Java lesen und schreiben XML & JSON 3
R key aus xml lesen mittels jdom XML & JSON 5
F XML ( ca. 280 MB) JDom & SAXBuilder lesen = OutOfMemoryE XML & JSON 4
O XML lesen, wenn DTD in anderem Verzeichnis XML & JSON 2
R Daten aus xml lesen und in Strings speichern XML & JSON 4
R xml mit Jdom lesen und als Jtree anzeigen. XML & JSON 9
J Jdom Elemente lesen XML & JSON 5
thE_29 Vor dem ersten Posten bitte lesen! XML & JSON 0

Ähnliche Java Themen

Neue Themen


Oben