Как разобрать этот пользовательский XML в Android с помощью xmlpullparser - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть этот xml:

  <cars>
   <a b="car" c="blue">

    <x year="01"/>
    <x year="03"/>

   </a>

   <a b="truck" c="red">
    <x year="04"/>
    <x year="85"/>
   </a>

</cars>

И я хочу разобрать объект (arraylist) следующим образом:

01:["car", "blue", "01, 03"]

02:["truck", "red", "04, 85"]

Обратите внимание, что двухлетние атрибуты объединяются в одной строке. Вот что я не могу понять.

Парсер, который я использую, является родным для Android XMLPullParser

Я не могу изменить формат XML, но я мог бы использовать другой совместимый с Android парсер, если это того стоит.

Если неясно, он должен подходить для такого класса:

private String car;
private String color;
private String years;


public ClassVehicle(String aCar, String c, String ys) {
    this.orden = aCar;
    this.intext = c;
    this.lugar = ys;


}

 getters & setters toString() and so on

Окончательный результат получит столько же arraylists (объектов), сколько автомобилей:

 ArrayList<ClassCar> oCars = new ArrayList<ClassCar>();

oCars.add(new ClassCar(car, color, years));

1 Ответ

2 голосов
/ 25 ноября 2011

Ваш фрагмент НЕ является XML… См. Расширяемый язык разметки (XML) 1.1 (второе издание) .

  • Значения атрибута c не закрыты.
  • тег x не закрыт.
  • У вас есть несколько корневых ...

Если это опечатки, исправьте их, и я проверю, смогу ли я дать реальный ответ ...

Как ответственный программист, не используйте этот формат, а перенесите данные в четко определенный формат, но не пытайтесь использовать этот вид поврежденного формата в клиентском приложении.

Обновление

Вот быстрая и грязная реализация (используя мой собственный POJO Vehicle):

public class Butelo extends Activity
{
    public static String TAG = "SO Butelo";

    public static List<Vehicle> vehicles = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput( new StringReader ( "<cars><a b=\"car\" c=\"blue\"><x year=\"01\"/><x year=\"03\"/></a><a b=\"truck\" c=\"red\"><x year=\"04\"/><x year=\"85\"/></a></cars>") );

            int eventType = xpp.getEventType();
            boolean done = false;

            Vehicle currentVehicle = null;

            while (eventType != XmlPullParser.END_DOCUMENT && !done) {

                String name = null;
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        vehicles = new ArrayList<Vehicle>();
                        break;
                    case XmlPullParser.START_TAG:
                    name = xpp.getName();
                        if (name.equals("a")){
                            currentVehicle = new Vehicle();
                            currentVehicle.setType(xpp.getAttributeValue(null, "b"));
                            currentVehicle.setColor(xpp.getAttributeValue(null, "c"));
                        } else if (name.equals("x")) {
                            currentVehicle.appendToYears(xpp.getAttributeValue(null, "year"));
                        }
                    break;
                    case XmlPullParser.END_TAG:
                    name = xpp.getName();
                    if (name.equals("a")){
                            vehicles.add(currentVehicle);
                        }
                    break;
                }
                eventType = xpp.next();
            }


        } catch (FileNotFoundException e) {
            Log.e(TAG, "", e.fillInStackTrace());
        } catch (XmlPullParserException e) {
            Log.e(TAG, "", e.fillInStackTrace());
        } catch (IOException e) {
            Log.e(TAG, "", e.fillInStackTrace());
        }

        for(int i=0;i<vehicles.size();i++) {
            Vehicle vehicle = vehicles.get(i);
            Log.v(TAG, vehicle.toString());
        }

    }

    private class Vehicle {
        private String mType;
        private String mColor;
        private String mYears = "";

        void setType(String type) { mType = type; }
        String getType() { return mType; }
        void setColor(String color) { mColor = color; }
        String getColor() { return mColor; }
        void appendToYears(String year) {
            StringBuilder sb = new StringBuilder(mYears);

            if (!mYears.equals("")) {
                sb.append(", ");
            }
            sb.append(year);
            mYears = sb.toString();
        }
        String getYears() { return mYears; }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder("[\"");
            sb.append(mType);
            sb.append("\", \"");
            sb.append(mColor);
            sb.append("\", \"");
                sb.append(mYears);
            sb.append("\"]");

            return sb.toString();
        }
    }
}

Это просто для того, чтобы вы встали на свой путь ...

...