2011-12-05 105 views
0

我是XML解析的新手,並且想要將由Web服務產生的XML文件轉換爲POJO列表。因爲我已經和JSon做了一些工作,發現它很容易處理。而在XML的情況下有一個安靜的同樣的過程,但我無法找到穿越層次結構併到達特定節點以解析POJO的方式。正如我用例子來解釋我的問題。這裏是響應XML格式獲取可以使用XStream解析的XML的特定對象

<hash> 

<resp_status>1</resp_status> 

<message>success</message> 

<errors></errors> 

<calendars> 
    <calendar> 
     <id>44</id> 

     <name>Air Force</name> 

     <expiry_date>2012-03-01</expiry_date> 

     <thumbnail_url>http://www.countdownyourgame.com/uploads/44_thumbnail.png</thumbnail_url> 
    </calendar> 
    <calendar> 
     <id>103</id> 

     <name>Akron</name> 

     <expiry_date>2012-02-01</expiry_date> 

     <thumbnail_url>http://www.countdownyourgame.com/uploads/103_thumbnail.png</thumbnail_url> 
    </calendar> 
    <calendar> 
     <id>16</id> 

     <name>Alabama</name> 

     <expiry_date>2012-03-01</expiry_date> 

     <thumbnail_url>http://www.countdownyourgame.com/uploads/16_thumbnail.png</thumbnail_url> 
    </calendar> 
</calendars> 

和JSON格式相同的反應

{ 
"hash": 
    { 
    "resp_status":"1", 
    "message":"success", 
    "errors":"", 
    "calendars": 
     { 
     "calendar":[ 
        { 
         "id":"44", 
         "name":"Air Force", 
         "expiry_date":"2012-03-01", 
         "thumbnail_url":"http://www.countdownyourgame.com/uploads/44_thumbnail.png" 
         }, 

         { 
         "id":"103", 
         "name":"Akron", 
         "expiry_date":"2012-02-01", 
         "thumbnail_url":"http://www.countdownyourgame.com/uploads/103_thumbnail.png" 
         }, 

         { 
         "id":"16", 
         "name":"Alabama", 
         "expiry_date":"2012-03-01", 
         "thumbnail_url":"http://www.countdownyourgame.com/uploads/16_thumbnail.png" 
         } 
         ] 
     } 
    } 
} 

這裏是POJO的

public class Calendar { 

private String id, name, expiry_date, thumbnail_url; 

Calendar() { 
    id = new String(""); 
    name = new String(""); 
    expiry_date = new String(""); 
    thumbnail_url = new String(""); 
} 

public String getId() { 
    return id; 

} 

public void setId(String id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 

} 

public void setName(String name) { 
    this.name = name; 
} 

public String getExpiryDate() { 
    return expiry_date; 

} 

public void setExpiryDate(String expiry_date) { 
    this.expiry_date = expiry_date; 
} 

public String getThumbnailUrl() { 
    return thumbnail_url; 

} 

public void setThumbnailUrl(String name) { 
    this.thumbnail_url = name; 
} 

} 
內部包含日曆(文件名Calendar.java)日曆對象

轉換上述JSon迴應我只需要下面的代碼

JSONObject json=new JSONObject(JsonResponceString); 
     for(int i=0;i<json.getJSONObject("hash").getJSONObject("calendars").getJSONArray("calendar").length();i++) 
     { 
      //by using refrenced jar of Gson 
      Calendars obj=new Gson().fromJson(json.getJSONObject("hash").getJSONObject("calendars").getJSONArray("calendar").getJSONObject(i).toString(), Calendar.class); 
      //ArrayList for calendar type objects 
      calendarList.add(obj); 

     } 

上面的過程用XML有很多解析器,但是我發現XStream是一個簡單的解析器。 這裏如圖下面的鏈接http://x-stream.github.io/tutorial.html在示例中,存在一個對象不將其轉化爲POJO對象的陣列中的代碼

這裏底部部分限定是我的問題,我怎樣可以遍歷扔整個XML響應,並獲取可以轉換爲字符串的特定或所有日曆對象(XML對象),然後將其作爲參數傳遞給fromXML()方法,以便解析爲POJO。

我自己寫一個類來使用字符串方法或正則表達式來拆分日曆對象的任何想法將需要相同的時間來選擇簡單的解析所以請幫助我通過一個乾淨的答案,我的過程我'嘗試是否可能,可能但不是這樣...然後以什麼方式?

我還研究了其他人特別是JAXB,但它需要架構,儘管它甚至可以爲您設計POJO,但如果我不需要整個XML來解析問題,我所擁有的大多數解析器都是可能的來解析整個響應,並因此要求POJO的這種混亂的結構。如果我錯了,請建議我,但有一些堅實的例子... thankx

+0

JAXB不需要XML架構。既然你已經嘗試過XStream,下面的文章可能會有用。它使用JAXB和XStream將相同的對象模型映射到相同的XML文檔:http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html –

回答

0

最後發現類似以JSON的方式。我希望這可以幫助別人。 @parag這是我在問.........我感謝你的幫助,但是這不是我一直在尋找..

package com.samjanz.xmlparsing; 

import java.util.ArrayList; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import com.samjanz.xmlparsing.helpers.MyConverter; 
import com.samjanz.xmlparsing.helpers.MyHTTPConnector; 
import com.samjanz.xmlparsing.pojos.Calendar; 
import com.thoughtworks.xstream.XStream; 

public class XmlParsingActivity extends Activity { 

LinearLayout parent; 
String serverResponce; 
Document xmlDoc; 
ArrayList<Calendar> calendarList; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    parent = (LinearLayout) findViewById(R.id.parent); 
    XStream xstream = new XStream(); 
    xstream.alias("calendar", Calendar.class); 

    calendarList = new ArrayList<Calendar>(); 
    String url = getText(R.string.calendar_url).toString(); 
    // get DOC 
    xmlDoc = MyConverter.streamToDocument(MyHTTPConnector.UrlToStream(url)); 
    NodeList nodeLst = xmlDoc.getElementsByTagName("calendar"); 

    for (int i = 0; i < nodeLst.getLength(); i++) { 
     Node node = nodeLst.item(i); 
     if (node != null) { 
      Calendar obj = (Calendar) xstream.fromXML(MyConverter 
        .nodeToString(node)); 
      calendarList.add(obj); 
      LayoutParams lparams = new LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      TextView tv = new TextView(this); 
      tv.setLayoutParams(lparams); 
      tv.setText("\n\nLoop No:" + (i + 1) + "\nId = " 
        + calendarList.get(i).getId() + "\nName = " 
        + calendarList.get(i).getName() + "\nExpiry Date = " 
        + calendarList.get(i).getExpiryDate() 
        + "\nThumbnail Url = " 
        + calendarList.get(i).getThumbnailUrl()); 
      parent.addView(tv); 

     } 

    } 
} 

}

0

或者,您可以使用SAX解析器來解析XML。

Refer this example code

+0

這不是答案我想他們通過XML文件遍歷和獲得特定部分的方式 –