2011-05-03 30 views
1

我有一個Android程序來表示數據結構是這樣的:簡單的XML:如何詮釋我的「點」類

<?xml version="1.0" encoding="utf-8"?> 
<points> 
    <point id="La Gioconda"> 
     <rssi id="north">-55</rssi> 
     <rssi id="east" >-76</rssi> 
     <rssi id="south">-64</rssi> 
     <rssi id="east" >-92</rssi> 
    </point> 
    <point id="La Pietà"> 
     <rssi id="north">-51</rssi> 
     <rssi id="east" >-60</rssi> 
     <rssi id="south">-88</rssi> 
     <rssi id="east" >-59</rssi> 
    </point> 
</points> 

下面我彙報班點,點和RSSI我用,讓這個錯誤:

05-03 07:49:19.884: DEBUG/com.marcos.training.TrainingActivity(354): org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.Element(data=false, name=, required=true, type=void) on field 'dbm' protected java.lang.Integer com.marcos.training.Rssi.dbm for class com.marcos.training.Rssi at line 4 

可以肯定我錯過了一些東西明顯... :-(

文件Points.java:

package com.marcos.training; 

import java.util.List; 

import org.simpleframework.xml.Element; 
import org.simpleframework.xml.ElementList; 

@Element 
public class Points { 
    @ElementList(inline=true) 
    private List<Point> list; 

    public Integer getSize() { 
     return list.size(); 
    } 

    public List<Point> getList() { 
     return list; 
    } 
} 

文件Point.java:

package com.marcos.training; 

import java.util.List; 

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.ElementList; 
import org.simpleframework.xml.Root; 

import android.util.Log; 

@Root 
public class Point { 
    private final static String TAG = TrainingActivity.class.getCanonicalName(); 

    @ElementList(inline=true) 
    private List<Rssi> list; 

    @Attribute 
    protected String id; 

    public String getId() { 
     return id; 
    } 

    public Integer getRssi(String id) { 
     int len = list.size(); 
     for (int i = 0; i < len; i++) { 
      if (list.get(i).getId().equalsIgnoreCase(id)) { 
       return list.get(i).getDbm(); 
      } 
     } 
     Log.d(TAG, "getRssi(): unforeseen id \"" + id + "\""); 
     return 999; 
    } 
} 

文件Rssi.java:

package com.marcos.training; 

import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Element; 
import org.simpleframework.xml.Root; 

@Root 
public class Rssi { 

    @Attribute 
    protected String id; 

    @Element 
    protected Integer rssi; 

    public String getId() { 
     return id; 
    } 

    public Integer getRssi() { 
     return rssi; 
    } 
} 

回答

6

問題是與你的Rssi類。該rssi元素沒有子元素,因此下面的註釋是不正確

@Element 
protected Integer rssi; 

您需要使用@Text註解來替代:

@Text 
protected Integer rssi; 

或者,它會更好使用ElementMap來保存rssi映射,而不是列表。例如,您可以將您的Point類更改爲:

@Root 
public class Point { 

    @ElementMap(entry="rssi", key="id", attribute=true, inline=true) 
    private Map<String,Integer> rssiMap; 

    @Attribute 
    protected String id; 

    public String getId() { 
     return id; 
    } 

    public Integer getRssi(String id) { 
     Integer val = rssiMap.get(id); 
     if(val == null){ 
      return 999; 
     } 
     return val; 
    } 
} 
+0

我覺得這是最好的解決方案,謝謝! – MarcoS 2011-05-03 14:34:49

+0

我沒有按照你的第二個建議來使用ElementMap,但是,當序列化我的新點類時,我得到這個異常:java.lang.NumberFormatException:無法解析''作爲整數:我應該改變我的poinys.xml結構,還是我想念別的東西? – MarcoS 2011-05-04 12:20:52

+0

Post scriptum:在簡單的引號中,我有一些空格,一個換行符和多個空格... – MarcoS 2011-05-04 12:35:44

2

首先,你應該從RSSI和點類中刪除@Root,因爲它們不屬於XML的根源。

其次,你顯然在這裏有你的類或xml老,因爲錯誤與某些「dbm」字段相關,這在xml和java代碼中是錯過的。我認爲,在新的版本,你有這樣的:

<rssi id="north" dbm="55"/> 

然後,所有你需要的是在RSSI類:

@Attribute 
    private Integer dbm;