我必须在Android程序中表示这样的数据结构:
<?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>
下面我报告我使用的Points,Point和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;
}
}
最佳答案
问题出在您的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;
}
}