2011-04-26 53 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