2013-12-08 4 views
1

Я пытаюсь прочитать/разобрать RSS-канал из изображения НАСА дня. Вот код ниже. Я получаю исключение, которое мне сказать это:Я получаю недопустимый байт, когда я пытаюсь разобрать xml

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.arrangeCapacity(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(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.AbstractSAXParser.parse(Unknown Source) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
at Start.processFeed(Start.java:30) 
at Loader.main(Loader.java:12) 

Что я делаю неправильно?

P.S. конечно, у меня есть другой класс с основным методом :)

Заранее спасибо.

import java.io.InputStream; 
import java.net.URL; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 


public class Start extends DefaultHandler { 

    private String url = "http://www.nasa.gov/rss/dyn/image_of_the_day.rss"; 
    private boolean inUrl = false; 
    private boolean inTitle = false; 
    private boolean inDescription = false; 
    private boolean inItem = false; 
    private boolean inDate = false; 

    public void processFeed() { 
      try { 
      SAXParserFactory factory = 
       SAXParserFactory.newInstance(); 
      SAXParser parser = factory.newSAXParser(); 
      XMLReader reader = parser.getXMLReader(); 
      reader.setContentHandler(this); 
      InputStream inputStream = new URL(url).openStream(); 
      reader.parse(new InputSource(inputStream)); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } // processFeed 


    @Override 
    public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 

    if(localName.startsWith("item")) { inItem = true; } 
    else if (inItem) { 
     if(localName.equals("title")) { inTitle = true; } 
     else { inTitle = false; } 

     if(localName.equals("description")) { inDescription = true; } 
     else { inDescription = false; } 

     if(localName.equals("pubDate")) { inDate = true; } 
     else { inDate = false; } 
    } 

} 


@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    String chars = new String(ch).substring(start, start + length); 

    if(inTitle) { System.out.println(chars); } 
    if(inDescription) { System.out.println(chars); } 
    if(inDate) { System.out.println(chars); } 
} 

}

ответ

1

Субъект ответ GZIP закодированный (так он сжат)! Вы можете обернуть входной поток в GZIPInputStream:

InputStream inputStream = new GZIPInputStream(new URL(url).openStream()); 

Вы должны использовать «длинную форму» чтения сформировать URL с помощью , так что у вас есть больше контроля над соединением и может проверить, является ли или нет содержимое сжимается.

URL url = new URL(urlString); 
HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
// we're not really connected now. Just the connection object has been created 
// here you can set additional request properties (e.g. request headers) 
con.connect(); 
// now we are connected! 
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { 
    try (InputStream entityStream = con.getInputStream()) { 
     InputStream is; 
     if ("gzip".equals(con.getContentEncoding())) { 
      is = new GZIPInputStream(entityStream); // wrap 
     } else { 
      is = entityStream; 
     } 

     reader.parse(new InputSource(is)); 
    } 
} else { 
    // handle HTTP response code != OK 
} 
con.disconnect(); 
+0

Я никогда не думал о сжатии, спасибо – SuperManEver

+0

Можете ли вы дать ссылку на какую-то статью или что-то еще, где я могу больше узнать об этом? – SuperManEver

+0

Здесь речь идет о URLConnections в целом: http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html. Что касается HTTP в специальном режиме, вы можете искать HTTP-запросы и заголовки ответов и коды ответов. – isnot2bad

Смежные вопросы