2011-02-14 59 views
2

我有這種格式解析複合型XML

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
    <ns1:GetResponse> 
     <ret SOAP-ENC:arrayType="ns2:Map[2]" xsi:type="SOAP-ENC:Array"> 
     <item xsi:type="ns2:Map"> 
      <item> 
       <key xsi:type="xsd:string">ProtocolId</key> 
       <value xsi:type="xsd:string">1</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">Title</key> 
       <value xsi:type="xsd:string">Some Title</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">Text</key> 
       <value xsi:type="xsd:string"> Some Text </value> 
      </item> 
     </item> 
     <item xsi:type="ns2:Map"> 
      <item> 
       <key xsi:type="xsd:string">ProtocolId</key> 
       <value xsi:type="xsd:string">2</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">Title</key> 
       <value xsi:type="xsd:string">Another Title</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">Text</key> 
       <value xsi:type="xsd:string">Another Text </value> 
      </item> 
     </item> 
     </ret> 
    </ns1:GetResponse> 
</SOAP-ENV:Body> 

如何寫這類的XML解析器返回XML SOAP Web服務。如果你有一些例子,它會有很大的幫助。

感謝

穆庫爾

+0

「寫一個解析器」是什麼意思?沒有足夠的XML解析器可用嗎? – Tomalak 2011-02-14 09:50:05

+0

對不起,我的問題是,這個特殊的XML是非常大的,並且Android設備耗盡內存,同時試圖解析它,因爲它的堆是非常小的(16 MB)。所以,我想要一些定製的解析器,我可以直接將這個XML的內容寫入一個db文件,而不是創建一個包含1500多個對象的列表。 – 2011-02-14 18:00:36

回答

2

我做了這個解析器的工作 -

public class XmlPullFeedParser extends BaseFeedParser { 
public XmlPullFeedParser(String feedUrl) { 
    super(feedUrl); 
} 

StringBuilder builder = new StringBuilder(); 
int whichItemFlag = 0; 

Context thisContext; 

DataBaseHelper myDB; 

public void parse(InputStream is, Context context, String insertInto) { 

    XmlPullParser parser = Xml.newPullParser(); 

    thisContext = context; 
    myDB = new DataBaseHelper(thisContext); 
    try { 
     // auto-detect the encoding from the stream 
     parser.setInput(is, "UTF-8"); 
     int eventType = parser.getEventType(); 
     boolean done = false; 
     while (eventType != XmlPullParser.END_DOCUMENT && !done) { 
      String name = null; 
      String attr = null; 
      switch (eventType) { 
      case XmlPullParser.START_DOCUMENT: 
       break; 
      case XmlPullParser.START_TAG: 
       name = parser.getName(); 
       attr = parser.getAttributeName(0); 
       if (name.equalsIgnoreCase(ITEM)) { 
        if(attr!=null) { 
         builder.append("("); 
        } 
        whichItemFlag++; 
       } else if (name.equalsIgnoreCase(VALUE)) { 
        builder.append("'"+parser.nextText().replaceAll("'", "&#39;")+"',"); 
       } 
       break; 
      case XmlPullParser.END_TAG: 
       name = parser.getName(); 
       if (name.equalsIgnoreCase(ITEM)) { 
        whichItemFlag--; 
        if(whichItemFlag==0) { 
         builder.delete(builder.length()-1, builder.length()); 
         builder.append(")"); 
         writeStringToDb(insertInto, builder.toString()); 
         builder.delete(0, builder.length()); 
        } 
       } 
       break; 
      } 
      eventType = parser.next(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
//   throw new RuntimeException(e); 
    } finally { 
     myDB.close(); 
    } 
} 

private void writeStringToDb(String insertInto, String string) { 
    SQLiteDatabase db = myDB.getWritableDatabase(); 
    String sql = insertInto + string; 
    db.execSQL(sql); 
    db.close(); 
} 

StringBuilder的我已經習慣了由XML返回的值創建一個字符串,並使用此字符串直接寫入數據庫。解析方法需要一個輸入流,應用程序上下文和一個幫助我構建sql語句的字符串。從解析器本身直接寫入數據庫。由於XML非常大(7MB),我不得不這樣做,否則我的android設備會在構建1500多個對象時耗盡內存。