0

私はこの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"]

2 つの年の属性が同じ文字列にまとめられていることに注意してください。それは私が理解できないものです。

私が使用しているパーサーは、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

最終結果は、車と同じ数の配列リスト (オブジェクト) になります。

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

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

1 に答える 1

2

あなたのスニペットは XML ではありません… Extensible Markup Language (XML) 1.1 (Second Edition)を参照してください。

  • c 属性値は閉じていません。
  • xタグは閉じていません。
  • 複数のルートがあります…</li>

これらがタイプミスである場合は、それを修正してください。本当の答えを提供できるかどうかを確認します…</p>

責任あるプログラマーとして、その形式を使用するのではなく、データを適切に定義された形式に移行しますが、クライアント アプリケーションでこの種の破損した形式をわざわざ使用しないでください。

アップデート

これは簡単な実装です (私自身の Vehicle POJO を使用):

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

それはあなたを自分の道に導くためです…</p>

于 2011-11-24T20:11:02.773 に答える