2015-09-23 72 views
1

我想弄清楚用Wolfram | Alpha API分析結果的XML,我已經在Android中搜索關於XmlPullParser的一般問題,但似乎無法解析XML數據。Android XmlPullParser Wolfram | Alpha API

try { 
    URL url = new URL(urlString); 
    URLConnection urlConnection = url.openConnection(); 
    InputStream response = urlConnection.getInputStream(); 

    XmlPullParser parser = Xml.newPullParser() 
    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
    parser.setInput(response, null); 
    parser.nextTag();    
    results = readFeed(parser); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

我可以連接API並返回結果。 http://products.wolframalpha.com/api/explorer.html 你將能夠看到你回來的結果。

隨着我的基本要求看起來像這樣:http://api.wolframalpha.com/v2/query?appid=xxx&input=What%20day%20is%20today%3F&format=plaintext

現在解析InputStream的:

private List<String> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, null, "queryresult"); 
    List<String> entries = new ArrayList<>(); 

    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 

     String name = parser.getName(); 

     // Starts by looking for the entry tag 
     if (name.equals("pod")) { 
      System.out.print(" In pod: " + parser.getName()); 
      entries.add(readEntry(parser)); 
     } 
     else{ 
      skip(parser); 
     } 
    } 

    return entries; 
} 

private String readEntry(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, null, "pod"); 
    String plainText = null; 

    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 

     String name = parser.getName(); 

     if (name.equals("subpod")) { 
      System.out.print(" In subpod: " + parser.getName()); 
      plainText = getPlainText(parser); 
     } 
     else{ 
      skip(parser); 
     } 
    } 

    return plainText; 
} 

private String getPlainText(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, null, "subpod"); 
    String result = null; 

    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 

     String name = parser.getName(); 

     if (name.equals("plaintext")) { 
      System.out.print(" In plaintext: " + parser.getText()); 
      result = parser.getText(); 
     } 
     else{ 
      skip(parser); 
     } 
    } 

    return result; 
} 

在我的控制檯的樣子,結果是這樣的:

I/System.out﹕ In pod: pod In subpod: subpod In plaintext: null[null] 

的代碼運行正常,但有一些問題:

  1. 它找不到明文標記的值。
  2. 這似乎只循環通過第一個pod標籤。

回答

0
  • 在你getPlainText()方法,則需要推進的START_TAG事件,然後調用parser.getText()。我相信你需要前進到TEXT事件以便parser.getText()返回任何東西。你可能意思是使用parser.nextText()

  • 由於您的使用方式parser.next(),您無法獲取所有標籤。

    getPlainText(),你循環直到你點擊END_TAG,然後返回。現在readEntry()正處在一個循環的中間,所以接下來發生的事情是parser.next()又叫做。由於您已經在END_TAG事件中,您最終會跳過整個標籤。您應該測試事件類型爲parser.getEventType(),這不會使解析器前進。當您完成當前事件(包括決定跳過)時,只能撥打parser.next()

    當您收到END_TAG事件時,您也正在退出。你真的想通過測試END_DOCUMENT來開始循環,因爲顯然parser.next()可能會或可能不會在END_DOCUMENT事件之後拋出異常,這取決於您使用哪個工廠構建解析器,因爲有幾個不同的工廠XmlPullParser工廠。瞭解更多關於這個問題:

    Issue 29931: XmlPullParser.next() doesn't throw an exception after END_DOCUMENT is reached