2011-04-26 82 views
2

是什麼讓我這點解析在Android XML:如何正確從HTTP資源

我寫了一個XML Web服務,從存儲在數據庫中的客戶關係管理提供數據。 XML Web服務的目的是讓我能夠以一種易於其他應用程序連接和讀取的格式向外界提供有限的一組只讀數據。 (或者我想過)。

我的具體問題:

我需要寫在Android的應用程序可以從該Web服務解析XML和原生應用呈現給我的用戶。 建議連接到網站並將其拉入XML並將其解析爲對象的方式是什麼?

注:

我不能告訴你的XML的一個例子,因爲測試服務器目前不面向Internet(它會很快)。我也不擔心GUI的發展。我將數據發送到手機後,我會解決這個問題=)。

+1

用HTTP下載文件,然後用SAX解析器解析。 – Blundell 2011-04-26 14:17:59

+0

謝謝。我現在正在閱讀SAX Parser! – 2011-04-26 14:26:23

回答

2

以下是我們的某個Android應用的一些SAX代碼。

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
//. . . 
public class MyXmlHandler extends DefaultHandler 
{ 
    @Override 
    public void startDocument() 
    { 
     Log.i(TAG,"Starting to parse document."); 
    } 
    @Override 
    public void endDocument() 
    { 
      Log.i(TAG,"End of document."); 
    } 
    @Override 
    public void startElement(String uri,String localName,String qName,Attributes attributes) 
    { 
     if(localName.equals("myxmltag")) 
     { 
       //do something with myxmltag and attributes. 
     } 
    }  
}  
public void parseDocument() 
{ 
    try { 
     URL myxmlUri = new URL("file:///sdcard/appfolder/myxmldoc.xml"); 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 
     MyXmlHandler myxmlhandler = new MyXmlHandler(); 
     xr.setContentHandler(myxmlhandler); 
     InputSource inputs = new InputSource(myxmlUri.openStream()); 
     xr.parse(inputs); 
     // . . . 

,下載代碼有

private void downloadFile(String url, String destination) throws ParserConfigurationException, FileNotFoundException, SAXException, UnsupportedEncodingException, ClientProtocolException, IllegalStateException, IOException { 
    if(isNetworkAvailable(this)){ 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(url); 
     MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
     get.setHeader("user_id", user_id); 
     reqEntity.addPart("user_id", new StringBody(user_id)); 
     HttpResponse response = client.execute(get); 
     HttpEntity resEntity = response.getEntity(); 
     if (resEntity != null) { 
      String serverResponse = EntityUtils.toString(resEntity); 
      BufferedWriter out = new BufferedWriter(new FileWriter(destination)); 
      out.write(serverResponse); 
      out.close(); 
     } 
    } 
} 

而且isNetworkAvailable

public static boolean isNetworkAvailable(Context context) 
{ 
    ConnectivityManager connectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity == null) { 
     Log.w("tag", "Connectivity Manager failed to retrieve."); 
    } else { 
     NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
     if (info != null) { 
      for (int i = 0; i < info.length; i++) { 
       if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 
      } 
     } 
    } 
    return false; 
} 

你可能想編輯downloadFile所以有一些後果,如果isNetworkAvailable返回false。

編輯:我刪除了一些代碼,可能已經在你的方式。我給了一切以「my」開頭的通用名稱,而不是我的代碼中的內容。

+0

謝謝。我一直在評論IBM放下的一個例子,這比在這裏讀你的代碼更令人困惑。 – 2011-04-26 14:59:51

+1

很簡單。你所要做的就是創建一個擴展DefaultHandler的類,爲你想要使用的內容重寫:startDocument,endDocument,startElement,endElement。然後實例,設置內容處理程序,並解析! :)歡呼聲 – adorablepuppy 2011-04-26 15:09:21

+0

今晚我會更多地關注這個項目。如果我遇到其他問題,我會更新。感謝您的幫助adorablepuppy。 – 2011-04-26 21:10:29