2016-03-19 6 views
0

私は4日前に開始したAndroid Studioで非常に珍しい問題があります。 問題は次のとおりです:wikipedia、google、yahoo、いくつかのJavaドキュメントなど、ページを読み込み(解析)しようとすると例外がスローされますが、Eclipseで同じコードを書くとすべて正常です。 だから、ここ呼び出し元のクラス(活動)からのコードは次のとおりです。Android Studio - SAXParseExceptionがウィキペディアのページにアクセスすると

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(); 
    } 

} 

のAndroid Studioで例外がコードからスローされます:

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

そして、ここではImgCrawlerThreadからのコードがありますDocument doc = db.parse(https.getInputSteam())

Eclipseの実行からの結果は、次のようになります。

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

と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)` 

私は私にこの非合理的な問題についての合理的な意見を与えることができる人に感謝するでしょう!

答えて

1

HTML!= XML

XMLパーサーは入力文法に関してかなり厳格です。一方、Webブラウザは、不一致のタグなどと競合しなければならず、はるかに寛容です。 XMLパーサーを使ってWebページを解析しようとすると、敗戦になるでしょう。

GoogleでもAndroid内で同じ問題があります。 Html.fromHtml()のソースコードを見ると、HTMLがマークアップされたSpannableStringに変換され、jsoupというオープンソースライブラリが使用されていることがわかります。これにより、 "タグスープ" HTMLをXMLのように解析することができます。それは本当に壊れたHTMLマークアップの中であなたのための賢明なDOMを作成します。あなたのアプリケーションのためにjsoupを見ることをお勧めします。

+0

ええ、私は知っている** jsoup **は良いオプションです。しかし、私の目標は、Javaにネイティブなものを使用することでした。なぜなら、多くの外部jarを使用するとアンドロイドのスタジオが終了コード-1でアプリケーションを実行できないからです(ヒープメモリが不足していると思います)。とにかく、私は** jsoup **以外のすべての外部ジャーを削除し、すべて正常に動作しています。また、「System.err:javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)」をクリックすると、JAVA_HOMEディレクトリにあるソースとAppData AndroidStudioで使用されます。後は不要です。 –

+0

私の意見では、問題を引き起こしているものは、C:/ ProgramFiles/Javaのものではなく、AppData/Android/platform/sourcesフォルダのDocumentBuilder.javaソースです。コード、彼らは異なっていた。もう一度言及すると、これは更新前ではなく更新後に発生しました。不思議そうですね。 –

関連する問題