2011-11-24 61 views
0

我有了这个XML解析在Android的这种自定义XML:如何使用xmlpullparser

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

而且我想解析到一个对象(数组列表)是这样的:

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 

最终结果将尽可能多的ArrayList(对象)作为汽车:

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

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

回答

2

您的片段不是XML ...见Extensible Markup Language (XML) 1.1 (Second Edition)

  • c属性值未关闭。
  • x标签未关闭。
  • 您有多个根...

如果这些错别字,你应该纠正,我会检查,如果我可以提供一个真正的答案...

作为一个负责任的程序员,不要使用格式,而是将数据迁移到定义明确的格式,但不打扰在客户端应用程序上使用这种损坏的格式。

更新

这里是一个快速和肮脏的实现(用我自己的车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(); 
     } 
    } 
} 

这只是把你对你自己的路......

+0

井我会编辑一个snipett,它只是相关的部分。完成。 – butelo

+0

好的,我将很快用代码更新我的答案... – Renaud

+0

你想要一个列表或什么用于x?你是否已经设计了车辆的未知POJO? – Renaud