получение конкретного объекта xml, который можно проанализировать с помощью XStream - PullRequest
0 голосов
/ 05 декабря 2011

Я новичок в разборе XML и хочу преобразовать 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 для этого. если я ошибаюсь, пожалуйста, предложите мне, но на каком-нибудь убедительном примере ... спасибо

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Наконец-то нашел способ, похожий на 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 голосов
/ 05 декабря 2011

Либо вы можете использовать SAX-парсер для разбора xml.

См. Пример кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...