2013-11-20 151 views
1

我想解析來自http請求的響應。這是我從響應取得的字符串:Android SAX XML解析錯誤

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://my-web-address.com/webservices/">&lt;NewDataSet&gt; 
    &lt;Case&gt; 
    &lt;ID&gt;260023277&lt;/ID&gt; 
    &lt;CaseNumber&gt;8931-04-03&lt;/CaseNumber&gt; 

    &lt;/Case&gt; 

    . 
    . 
    . 
    &lt;/NewDataSet&gt;</string> 

所有元素(用點表示)是有效的。
這裏是我是如何解析使用SAX這個XML:

 SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 

     InputSource inputSource = new InputSource(new StringReader(responce)); // responce is my String containing XML. 
     CasesParser myXMLHandler = new CasesParser(); 
     xr.setContentHandler(myXMLHandler); 
     xr.parse(inputSource); 

CaseParser類擴展DefaultHandler和傳統的方式實現的所有功能。

所以確切的錯誤是解析器沒有檢測到除「string」元素以外的任何東西。它在startElement()方法CaseParser中檢測到它,然後在endElement()方法中檢測到它。解析器之間找不到其他元素。
檢索「字符串」的值時,我只獲得'<'字符。沒有其他的。

可能是什麼問題?

回答

0

這是我根據唐的答案得到的解決方法。
我分析裏面的內容<string>標籤與XMLPullParser,存儲在一個字符串的響應,然後送入該字符串(也就是現在沒有<string>標籤的XML)
這裏有一個小樣本,如果有人正在經歷同樣的問題:

XmlPullParserFactory factory = null; 
     String parsed = ""; 

     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      XmlPullParser xpp = factory.newPullParser(); 
      xpp.setInput(new StringReader (responce)); 
      int eventType = xpp.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       if(eventType == XmlPullParser.START_DOCUMENT) { 
        Log.d(Constants.TAG,"Start document"); 
       } else if(eventType == XmlPullParser.END_DOCUMENT) { 
        Log.d(Constants.TAG,"End document"); 
       } else if(eventType == XmlPullParser.START_TAG) { 
        Log.d(Constants.TAG,"Start tag "+xpp.getName()); 
       } else if(eventType == XmlPullParser.END_TAG) { 
        Log.d(Constants.TAG,"End tag "+xpp.getName()); 
       } else if(eventType == XmlPullParser.TEXT) { 
        Log.d(Constants.TAG,"Text "+xpp.getText()); 
        parsed = xpp.getText(); 
       } 
       eventType = xpp.next(); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     xmlResponse = parsed; 

所以從這裏,我在xmlResponse對象喂這是已經寫入處理和XML存儲在我的對象我CaseParser對象。
希望它可以幫助別人。乾杯!

1

你的主要問題是所有的xml標籤都被轉義了,這使得它們不是真正的xml標籤。

如果可能的話,你可能想與誰產生這個,並讓他們改變它,所以這個數據不會逃脫。

如果懇求更好的數據是不可能的,可能你需要的是對<string>標籤的所有內容讀入一個字符串,然後啓動另一解析器解析該字符串,其中第一個解析將有轉義的內容。

如果所有你得到的是一個單一的'<'字符,你可能已經取得期待characters方法的常見錯誤僅被調用一次。它可以被多次調用,並且您需要將數據收集到緩衝區中,然後將其轉換爲endElement方法中的字符串。

對於包含此集合邏輯的示例代碼,請參閱my answer to a related question

將這個解析正確解析得到<string>標記的所有內容到Java String後,您需要將該字符串用作另一個解析的內容。