2012-05-26 25 views
0

您好,我正在製作Android應用程序以從Wiki中提取一些數據,起初我打算尋找解析HTML的方法,但是有人向我指出的一點是,XML會更容易處理。現在,我試圖找到一種方法來正確解析XML。我試圖從網絡地址解析現在從:將XML從網站解析爲Android中的字符串數組請幫助我

http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Games&cmlimit=500&format=xml

我試圖讓每一個遊戲的標題爲一個字符串數組,我遇到了一些麻煩。我沒有我嘗試使用的代碼示例,它使用的是xmlpullparser。每次嘗試使用它時,我的應用程序都會崩潰。將XML保存在本地並從那裏解析會更好嗎?或者我會沒事從網址去?以及我將如何正確解析這個字符串數組?請幫助我,並感謝您花時間閱讀本文。

如果您需要查看代碼或任何可以在今晚晚些時候獲取的代碼,那麼此時我不在我的PC附近。謝謝。

+0

從後崩潰時的logcat的堆棧跟蹤。 – FoamyGuy

回答

2

每當你發現自己編寫簡單格式的解析器代碼(比如你的例子中的簡單格式)時,你幾乎總是做錯了事,不使用合適的框架。

例如 - 這有一組簡單的助手在android.sax包解析XML SDK中包含的,它只是碰巧你張貼的例子可以很容易地分析是這樣的:

public class WikiParser { 
    public static class Cm { 
     public String mPageId; 
     public String mNs; 
     public String mTitle; 
    } 
    private static class CmListener implements StartElementListener { 
     final List<Cm> mCms; 
     CmListener(List<Cm> cms) { 
      mCms = cms; 
     } 
     @Override 
     public void start(Attributes attributes) { 
      Cm cm = new Cm(); 
      cm.mPageId = attributes.getValue("", "pageid"); 
      cm.mNs = attributes.getValue("", "ns"); 
      cm.mTitle = attributes.getValue("", "title"); 
      mCms.add(cm); 
     } 
    } 
    public void parseInto(URL url, List<Cm> cms) throws IOException, SAXException { 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     try { 
      parseInto(new BufferedInputStream(con.getInputStream()), cms); 
     } finally { 
      con.disconnect(); 
     } 
    } 
    public void parseInto(InputStream docStream, List<Cm> cms) throws IOException, SAXException { 
     RootElement api = new RootElement("api"); 
     Element query = api.requireChild("query"); 
     Element categoryMembers = query.requireChild("categorymembers"); 
     Element cm = categoryMembers.requireChild("cm"); 
     cm.setStartElementListener(new CmListener(cms)); 
     Xml.parse(docStream, Encoding.UTF_8, api.getContentHandler()); 
    } 
} 

基本上,所謂像這樣:

WikiParser p = new WikiParser(); 
ArrayList<WikiParser.Cm> res = new ArrayList<WikiParser.Cm>(); 
try { 
    p.parseInto(new URL("http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Games&cmlimit=500&format=xml"), res); 
} catch (MalformedURLException e) { 
} catch (IOException e) { 
} catch (SAXException e) {} 

編輯:這是你如何創建一個List<String>代替:

public class WikiParser { 
    private static class CmListener implements StartElementListener { 
     final List<String> mTitles; 
     CmListener(List<String> titles) { 
      mTitles = titles; 
     } 
     @Override 
     public void start(Attributes attributes) { 
      String title = attributes.getValue("", "title"); 
      if (!TextUtils.isEmpty(title)) { 
       mTitles.add(title); 
      } 
     } 
    } 
    public void parseInto(URL url, List<String> titles) throws IOException, SAXException { 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
     try { 
      parseInto(new BufferedInputStream(con.getInputStream()), titles); 
     } finally { 
      con.disconnect(); 
     } 
    } 
    public void parseInto(InputStream docStream, List<String> titles) throws IOException, SAXException { 
     RootElement api = new RootElement("api"); 
     Element query = api.requireChild("query"); 
     Element categoryMembers = query.requireChild("categorymembers"); 
     Element cm = categoryMembers.requireChild("cm"); 
     cm.setStartElementListener(new CmListener(titles)); 
     Xml.parse(docStream, Encoding.UTF_8, api.getContentHandler()); 
    } 
} 

然後:

WikiParser p = new WikiParser(); 
ArrayList<String> titles = new ArrayList<String>(); 
try { 
    p.parseInto(new URL("http://zelda.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Games&cmlimit=500&format=xml"), titles); 
} catch (MalformedURLException e) { 
} catch (IOException e) { 
} catch (SAXException e) {} 
+0

謝謝你的回答,你太棒了,我還沒有實現這個,但從我看到這看起來它會工作完美,我不能夠感謝你!有一個問題,請原諒我,如果這是一個愚蠢的問題,我仍然是一些地區的noob,即使我有編程學位heh ..這是否會產生pageid,ns和數組中的標題?如果可以,我可以用它從cm選擇標題嗎?謝謝。 – kikurself

+1

這個例子的結果是一個包含所有屬性的「Cm」對象列表 - 但是您可以輕鬆地重新使用它來取代'List '而只是讀取'start'中的'title'屬性(屬性屬性)'方法並將其存儲在'List'中。 – Jens

+0

你好,感謝你對我在這個問題上的所有幫助,我還有一件事要問,我該如何重新設計這個列表,以取得一個列表和標題屬性?如果你不想回答那沒關係,我知道我聽起來很愚蠢,但我已經遠離編程,並且無法解決問題。感謝您的時間。 – kikurself