2013-03-19 77 views
0

我在解析我的android應用程序時遇到了一些實際問題。我使用DOM樣式解析器拉下了一些XML文件,它需要將近20秒才能完成,並在其上運行一些代碼,這些文件不超過30KB。Android w3c DOM解析很慢

這是從該方法的一些代碼:

代碼如下:

HttpURLConnection vehicles_conn = (HttpURLConnection) new URL("XXXXXXX").openConnection(); 
       vehicles_conn.setRequestMethod("POST");      
       vehicles_conn.setDoInput(true); 
       vehicles_conn.setDoOutput(true); 
       vehicles_conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 
       vehicles_conn.setChunkedStreamingMode(0); 
       String vehicles = URLEncoder.encode("LogonToken", "UTF-8") + "=" + URLEncoder.encode(gettoken, "UTF-8"); 
       OutputStream vehicles_os = vehicles_conn.getOutputStream(); 
       Writer vehicles_wr = new OutputStreamWriter(vehicles_os); 
       vehicles_wr.write(vehicles); 
       vehicles_wr.flush(); 
       InputStream vehicles_is = vehicles_conn.getInputStream(); 
       vehicles_wr.close(); 
       DocumentBuilderFactory vehicles_dbFactory = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder vehicles_dBuilder = vehicles_dbFactory.newDocumentBuilder(); 
       Document vehicles_doc = vehicles_dBuilder.parse(vehicles_is); 
       NodeList vehicles_nList = vehicles_doc.getElementsByTagName("UNIT"); 

for (int temp = 0; temp < vehicles_nList.getLength(); temp++) { 
        //Create a new vehicle object 
        Vehicle v = new Vehicle(); 

        Node vehicles_nNode = vehicles_nList.item(vehicles_temp); 
        if (vehicles_nNode.getNodeType() == Node.ELEMENT_NODE) { 

         Element vehicles_eElement = (Element) vehicles_nNode; 
         String something = (getTagValue("ID", vehicles_eElement)); 

......... 

現在,我的這些3(http連接僅稱爲ONCE然而,該方法內),它通過第一個XML文件中的26個「單位」運行 - 我們稱之爲XML1,然後遍歷第二個具有25個「位置」的XML2,直到ID字段與XML1匹配,然後抓取XML2的其他字段並存儲它們進入一個數組列表,然後用'Peopel'對XML3進行同樣的操作。一旦完成,它將回到最高層,並再次使用列表中的下一個ID開始。

現在,我的問題是,這個過程需要花費少於幾秒鐘的時間,理想情況下,這需要20!對於記錄來說,這是通過LG Nexus 4上的20Mbit Wifi實現的。可以通過Motoral Defy和Galaxy Ace 2進行復制。有誰知道爲什麼它如此之慢?

我是Java/Android的新手,所以我不知道我是否編寫了錯誤的代碼,或者XML解析速度慢?

+0

你喜歡vtd-xml解析器嗎? – 2016-04-06 21:20:55

回答

0

看來您的代碼將XML解析爲DOM,然後遍歷DOM一次以提取所需的數據。您應該考慮使用SAX解析器並在解析的項目交給應用程序時即時提取數據。

+0

嗨戴爾 - 這是否仍然意味着我可以分別從XML中的每個「節點」獲取數據?我讀過SAX解析器的工作方式稍有不同。 – Seb 2013-03-20 08:50:00

+0

DOM解析器生成中間數據結構(域對象模型),然後在解析完成後,您的代碼可以瀏覽DOM收集其所需的信息。 – 2013-03-25 18:46:54

+0

SAX解析器只是簡單地將它們在解析過程中發現的項目傳遞給您的代碼,並讓您的代碼完成它的工作 - 例如,您可以通過每次SAX解析器調用代碼時添加一個節點來創建DOM來說「我發現了一個新元素「更好的是,您仍然可以構建應用程序真正需要的數據結構。 – 2013-03-25 18:48:45