2011-12-05 3 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(ファイル名Calendar.java)

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; 
} 

} 
があるさ

上記の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が見つかりました。ここ

コード

の底部に定義されているPOJOに変換されたオブジェクトの配列が一つのオブジェクトではありません例では、以下のリンク http://x-stream.github.io/tutorial.htmlに示すように、ここで がどのように私は、全体のXMLレスポンスを投げる横切ることができるというのが私の問題であり、 JSonのような文字列に変換してから fromXML()メソッドへの引数として渡すことができる特定のまたはすべてのカレンダーオブジェクト(XMLオブジェクト)を取得し、POJOに解析されるようにします。

文字列メソッドまたは正規表現を使用してカレンダーオブジェクトを分割するために自分自身でクラスを作成するアイデアは、単純な解析を選択するのに必要な時間と同じ時間がかかりますので、試してみることは可能かどうか、可能ですがこの方法ではありません...そしてどのように?

私もJAXBを特別に研究しましたが、スキーマが必要ですが、POJOを設計することもできますが、XML全体を解析する必要がないと、ほとんどのパーサーで問題が起こる可能性がありますレスポンス全体を解析し、そのためにPOJOの厄介な構造を要求します。私が間違っているならば、私を提案するが、いくつかの固体の例としてください...

+0

JAXBは、XMLスキーマを必要としません。 XStreamを試したので、次の記事が役に立ちます。 JAXBとXStreamの両方を使用して、同じオブジェクトモデルを同じXM​​Lドキュメントにマップします。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

thankx別の方法としては、XMLを解析するためのSAXパーサーを使用することができます。で、最後の

Refer this example code

+0

これは答えではありません私は彼らがXMLファイルを通過して特定の部分を取得する方法をしたい –