获取xml的特定对象,可以使用XStream进行解析

时间:2011-12-05 12:42:05

标签: java android web-services xml-parsing

我是XML解析的新手,想要将Web服务产生的XML文件转换为POJO列表。因为我已经与JSon做了一些工作,发现它很容易使用。虽然在XML的情况下有一个安静的相同过程,但我找不到遍历层次结构并到达要解析为POJO的特定节点的方法。正如我用例子解释我的问题。这是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很简单。 在这里,如示例中的以下链接http://x-stream.github.io/tutorial.html所示,有一个对象不是对象数组,它转换为POJO,如代码底部所定义

这是我的问题,我如何遍历抛出整个XML响应并获取特定或所有日历对象(XML对象),这些对象可以像JSon一样转换为字符串,然后作为参数传递给fromXML()方法所以解析为POJO。

使用字符串方法或正则表达式自行编写一个类来分割日历对象的任何想法都需要花费相同的时间来选择简单的解析,所以请通过给出一个干净的答案来帮助我。尝试是否可能,可能但不是这样......然后以什么方式?

我还特别研究了其他JAXB,但它需要架构,虽然它甚至可以为你设计POJO但如果我不需要解析整个XML的问题,我所拥有的大多数解析器的问题是它们很可能解析整个响应,因此要求POJO的凌乱结构。如果我错了,请建议我,但有一些可靠的例子...... thankx

2 个答案:

答案 0 :(得分:0)

或者,您可以使用SAX解析器来解析xml。

Refer this example code

答案 1 :(得分: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);

        }

    }
}

}