2015-10-07 104 views
0

所以我經歷了無數的教程,並嘗試了一堆不同的想法,但對於我的生活無法弄清楚如何解析下面的XML feed。我試圖訪問'top_guessed_letters'& top_not_guessed_letters節點中的值。使用XMLParser解析Android中的XML feed

<REQUEST_GUESS_LETTER> 
    <top_guessed_letters>E-T-R-C-A</top_guessed_letters> 
    <top_not_guessed_letters>O-U-B</top_not_guessed_letters> 
    <top_correct>I-P-D</top_correct> 
    <smart_guess> 
     <smart_guess>R-C-A</smart_guess> 
     <smart_guess>E-T-R</smart_guess> 
     </smart_guess> 
</REQUEST_GUESS_LETTER> 

這裏是我的myActivity代碼:

XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 

    NodeList nl = doc.getElementsByTagName("REQUEST_GUESS_LETTER"); 

    for (int i = 0; i < nl.getLength(); i++) { 

     HashMap<String, String> map = new HashMap<String, String>(); 
     Element e = (Element) nl.item(i); 

     map.put("top_guessed_letters", parser.getValue(e, top_guessed_letters)); 

     menuItems.add(map); 
    } 

    ListAdapter adapter = new SimpleAdapter(this, menuItems, 
      R.layout.list_item, 
      new String[]{top_guessed_letters}, new int[]{ 
      R.id.topguessed}); 

    listView.setAdapter(adapter); 

XMLPullParser活動

public class XMLParser { 
public String getXmlFromUrl(String url) { 
    String xml = null; 

    Log.d("xmlTree", url); 


    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 

     HttpResponse httpResponse = httpClient.execute(httpGet); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     xml = EntityUtils.toString(httpEntity); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // return XML 
    Log.d("getXmlFromUrl ", xml); 
    return xml; 


} 

public Document getDomElement(String xml) { 
    Document doc = null; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    try { 

     DocumentBuilder db = dbf.newDocumentBuilder(); 

     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xml)); 
     doc = db.parse(is); 

    } catch (ParserConfigurationException e) { 
     Log.e("Error: ", e.getMessage()); 
     return null; 
    } catch (SAXException e) { 
     Log.e("Error: ", e.getMessage()); 
     return null; 
    } catch (IOException e) { 
     Log.e("Error: ", e.getMessage()); 
     return null; 
    } 

    Log.d("thisstuff", doc.toString()); 
    // return DOM 
    return doc; 

} 

public String getValue(Element item, String str) { 
    NodeList n = item.getElementsByTagName(str); 
    return this.getElementValue(n.item(0)); 
} 

public final String getElementValue(Node elem) { 
    Node child; 
    if (elem != null) { 
     if (elem.hasChildNodes()) { 
      for (child = elem.getFirstChild(); child != null; child = child.getNextSibling()) { 
       if (child.getNodeType() == Node.TEXT_NODE) { 
        return child.getNodeValue(); 
       } 
      } 
     } 
    } 
    return ""; 
} 

}

任何幫助,將不勝感激。

回答

0

我建議你看一下simple庫(de)序列化XML。

它只需要創建一個類並反序列化xml。例如:

@Root(name="REQUEST_GUESS_LETTER") 
public class Example { 

    @Element(name="top_guessed_letters") 
    private String guessed; 

    @Element(name="top_not_guessed_letters") 
    private String not_guessed; 

    public Example() { 
     super(); 
    } 

    public Example(String guessed, String not_guessed) { 
     this.guessed = guessed; 
     this. not_guessed = not_guessed; 
    } 

    public String getGuessed() { 
     return guessed; 
    } 

    public String getNotGuessed() { 
     return not_guessed; 
    } 
} 

然後執行此代碼。

Serializer serializer = new Persister(); 
File source = new File("example.xml"); 

Example example = serializer.read(Example.class, source); 
+0

這看起來很完美,正是我所期待的。我的問題是我怎樣才能將我的xml URL提要轉換爲文件? – AndroidDev21921

+0

它不需要是文件。它也可以是一個InputStream。請參閱文檔:http://simple.sourceforge.net/download/stream/doc/javadoc/org/simpleframework/xml/core/Persister.html#read%28java.lang.Class,%20java.io.InputStream%29 – EJay

+0

如果它對您有用,請將答案標記爲已接受 – EJay