2016-03-19 7 views
0

Ich habe ein sehr ungewöhnliches Problem mit Android Studio, die vor 4 Tagen begann (ich nehme nach dem Update). Das Problem ist: Die Ausnahme wird geworfen, wenn versucht wird, jede Seite zu lesen (parsen), ob es Wikipedia, Google, Yahoo, einige Java-Dokumentation ... ist, aber wenn ich den gleichen Code in Eclipse schreibe, funktioniert alles gut. So, hier ist der Code von der anrufenden Klasse (Aktivität):Android Studio - SAXParseException beim Zugriff auf Wikipedia-Seite

`new Thread(new ImgCrawlerThread("https://en.wikipedia.org/wiki/Batman_(comic_book)")).start();` 

Und hier ist der Code aus dem ImgCrawlerThread:

public void run() { 
    // TODO Auto-generated method stub 
    try { 
     //Thread.sleep(60000); 
     URL url = new URL(httpsurl); 
     HttpsURLConnection https = (HttpsURLConnection)url.openConnection(); 
     DocumentBuilder db; 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(https.getInputStream()); 
     NodeList nodes = doc.getElementsByTagName("img"); 
     System.out.println(nodes.item(0).getAttributes().getNamedItem("src").getNodeValue()); 
     https.disconnect(); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

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

} 

Die Ausnahme in Android Studio aus dem Code ausgelöst wird: Document doc = db.parse(https.getInputSteam())

Das Ergebnis aus der Eclipse-Ausführung sieht wie folgt aus:

//upload.wikimedia.org/wikipedia/en/thumb/4/4d/BatmanComicIssue1%2C1940.png/250px-BatmanComicIssue1%2C1940.png

Und aus dem Android Studio:

 `org.xml.sax.SAXParseException: expected: /img read: a (position:END_TAG </a>@43:317 in [email protected]) 
System.err:  at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146) 
System.err:  at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107) 
System.err:  at com.finki.filip.crawlingtest.CrawlerAsync.doInBackground(CrawlerAsync.java:61) 
System.err:  at com.finki.filip.crawlingtest.CrawlerAsync.doInBackground(CrawlerAsync.java:37) 
System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
System.err:  at java.lang.Thread.run(Thread.java:818)` 

Ich würde jedem dankbar sein, den mir eine vernünftige Meinung zu diesem irrationalen Problem geben könnte !!!

Antwort

1

HTML! = XML

XML-Parser sind ziemlich streng über Eingabegrammatik. Webbrowser hingegen müssen mit nicht übereinstimmenden Tags usw. zurechtkommen und sind viel fehlerverzeihender. Wenn Sie also versuchen, Webseiten mit einem XML-Parser zu parsen, wird dies ein verlustreicher Kampf sein.

Sogar Google hat das gleiche Problem in Android. Wenn Sie sich den Quellcode Html.fromHtml() ansehen, der HTML in das markierte SpannableString konvertiert, werden Sie feststellen, dass sie eine Open-Source-Bibliothek namens jsoup verwenden. Dies ermöglicht die Analyse von "tag-soup" HTML wie XML. Es wird aus wirklich gebrochenem HTML-Markup ein vernünftiges DOM für Sie erstellen. Ich schlage vor, Sie betrachten jsoup für Ihre Anwendung.

+0

Ja, ich weiß, dass ** jsoup ** eine gute Option ist. Aber mein Ziel war es, etwas zu verwenden, das in Java nativ ist, weil, wenn ich viele externe Gläser benutze, Android Studio die Anwendung mit dem Exit-Code -1 nicht ausführen kann (ich nehme an, wegen eines Mangels an Heap-Speicher). Wie auch immer, ich löschte alle meine externen Gläser außer ** jsoup ** und alles funktioniert gut. Außerdem habe ich festgestellt, dass ich, wenn ich auf "System.err: at javax.xml.parsers.DocumentBuilder.parse (DocumentBuilder.java:107)" klicke, zwei Quellen erhalte: die eine im Verzeichnis JAVA_HOME und die andere in AppData Wird von AndroidStudio verwendet. Letzteres ist unnötig. –

+0

Meiner Meinung nach ist das, was das Problem verursacht, die Quelle DocumentBuilder.java im Ordner AppData/Android/platform/sources und nicht in C:/ProgramFiles/Java, weil ich die beiden Teile von Code, sie waren anders. Und um noch einmal zu erwähnen, das passierte nach dem Update, vorher nicht. Seltsam, nicht wahr? –

Verwandte Themen