2014-04-08 63 views
0
public class GetXMLTask extends AsyncTask<String, Void, String> { 

// XML node names 
static final String NODE_EVEN = "event"; 
static final String NODE_NAME = "name"; 
static final String NODE_DATE = "date"; 
static final String NODE_LOC = "location"; 

private TextView txtView; 



public GetXMLTask(TextView txtView) { 
    this.txtView = txtView; 

} 

@Override 
protected String doInBackground(String... urls) { 
    String xml = null; 
    for (String url : urls) { 
     xml = getXmlFromUrl(url); 

    } 
    return xml; 
} 

@Override 
protected void onPostExecute(String xml) { 

    XMLDOMParser parser = new XMLDOMParser(); 
    InputStream stream = new ByteArrayInputStream(xml.getBytes()); 
    Document doc = parser.getDocument(stream); 

    NodeList nodeList = doc.getElementsByTagName(NODE_EVEN); 

    ArrayList<Event>events = new ArrayList<Event>(); 

    Event event = new Event(); 
    for (int i = 0; i < nodeList.getLength(); i++) { 
     // event = new Event(); 
     Element e = (Element) nodeList.item(i); 

     //will use for something later on 
     event.setName(parser.getValue(e, NODE_NAME)); 
     //event.setName(parser.getValue(e, NODE_DATE)); 
     event.setName(parser.getValue(e, NODE_LOC));    
     events.add(event); 
    } 
    txtView.setText(doc.toString()); // to test xml! 

} 

/* uses HttpURLConnection to make Http request from Android to download 
the XML file */ 
private String getXmlFromUrl(String urlString) { 
    StringBuffer output = new StringBuffer(""); 

    InputStream stream = null; 
    URL url; 
    try { 
     url = new URL(urlString); 
     URLConnection connection = url.openConnection(); 

     HttpURLConnection httpConnection = (HttpURLConnection) connection; 
     httpConnection.setRequestMethod("GET"); 
     httpConnection.connect(); 

     if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      stream = httpConnection.getInputStream(); 
      BufferedReader buffer = new BufferedReader(
        new InputStreamReader(stream)); 
      String s = ""; 
      while ((s = buffer.readLine()) != null) 
       output.append(s); 
     } 
    } catch (MalformedURLException e) { 
     Log.e("Error", "Unable to parse URL", e); 
    } catch (IOException e) { 
     Log.e("Error", "IO Exception", e); 
    } 

    return output.toString(); 


} 


} 

完成这项工作并不需要很长时间,所以考虑模拟器的速度有多慢,getxmlfromurl的权限必然会出错。我得到的输出在我的TextView从url中获取xml不起作用

[email protected] 

我的网址是调用getXMLFromUrl IV前细右测试的。

回答

2

没有什么是错的。您正在成功解析您在doc变量中引用的XML文档。

所有这一切都是错误的是你的期望Document.toString()会给你一些有意义的东西。它看起来没有被覆盖,这就是为什么你得到这个字符串。如果您想再次获取XML文本,则需要使用变压器IIRC。

getXmlFromUrl方法是坏了,但是 - 这是除换行符,这意味着如果你已经有了一个XML:

<foo>line 1 
line 2</foo> 

它最终会用一整块的内容“行1line2”,这是不正确。此外,您不应在不指定编码的情况下致电String.getBytes()。 (同上InputStreamReader没有编码。)基本上,目前还不清楚为什么你不直接从HttpURLConnection的输入链中解析XML ......这样的代码会少得多,并且会避免你目前的各种错误有你的代码。

+0

我刚刚更改了xmlFromUrl,现在可以工作。而且你的右边也跟着toString(),iv只是记录了event.getName,并且按照预期发布。 我有点困惑为什么toString()不工作,虽然? – nicwhitts