[Java] Pobieranie xml


(Tadek899) #1

Witam,

chciałbym parsowac tego xmla http://www.google.pl/ig/api?hl=pl&weather=lodz,

probowałem bezpośrednio z linku w ten sposob

String link="http://www.google.pl/ig/api?hl=pl&weather=lodz";

	URI cos = new URI(link);

	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

	DocumentBuilder builder = factory.newDocumentBuilder();

	Document doc = builder.parse(link);

niestety mam taki błąd:

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.

	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanLiteral(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)

	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)

	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)

	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

	at TestParse.(TestParse.java:72)

	at TestParse.main(TestParse.java:118)

Jeżeli zapisze plik przez przeglądarkę i parsuje z pliku to działa bezbłędnie. Więc próbowałem zczytać stronę do pliku:

URL link = new URL("http://www.google.pl/ig/api?hl=pl&weather=lodz");


		   String source = "";

		   BufferedReader in = new BufferedReader(new InputStreamReader(link.openStream(),"UTF-8"));

		   String linia;

	       while ((linia = in.readLine()) != null) 

	        {

	    	   source += linia+"\n";

	        }

	       in.close();


	       FileWriter fw = new FileWriter("a.xml");

	       fw.write(source);

	       fw.close();

i wszystko działa oprócz polskich znaków zamiast np Łódź mam " ? ?d? ", rozumiem że problem tkwi w kodowaniu ale nie mogę sobie z tym poradzić.

Znacie może jakieś inne xml które mogłbym wykorzystać?

pozdrawiam


(kostek135) #2

Co rozumiesz przez inne xml? http://pl.wikipedia.org/wiki/XML, napisali, że albo masz tam tag z kodowaniem (który może być opcjonalny), albo domyślnie to UTF-8 w systemie unikod. Generalnie chyba nie istnieje sposób, żeby poznać kodowanie pliku bez oczywistej deklaracji. Koniec końców ciąg bajtów jest tylko interpretowany jako jakiś znak, czy ich zbiór.


(Tadek899) #3

Tylko nie wiem czemu jeśli zapisze plik przez przeglądarkę to mam polskie znaki a jeśli przez ten kod to już nie:/

Chciałbym napisać program pobierający dane pogodowe z internetu. Chodziło mi o to czy nie znacie jakiegoś innego xml-a z danymi pogodowymi który można by było wykorzystać (najlepiej jak z największą ilością danych).


(kostek135) #4

Nie pytaj czemu (sam nie do końca rozumiem), ale z podanego url-a sciągnąłem ten plik poprawnie nie podając kodowania

BufferedReader in = new BufferedReader(new InputStreamReader(link.openStream()));

Tyle, że dla ogólnego przypadku, gdy plik nie jest kodowany w UTF-8 to nie przejdzie, zastanawia mnie tylko, czemu domyślnie on pobiera to poprawnie, a z parametrem narzuconym w funkcji już nie.

[EDIT]

Dobra już wiem, domyślnie kodowany jest ten plik w ISO 8859-2, mimo, iż ktoś tego nie uwzględnił w tagu, bubel autora strony.