my question is simple, but I can't find nothing about it.
I Have a list class and an entry class for XML Serialization:
@Root(name = "entries")
public class List {
@ElementList(required = false, entry = "entry", inline = true, empty = true)
private List<Entry> entries;
}
@Root
public class Entry {
@Element(name = "entry_id", required = true)
private long id;
@Element(name = "text", required = true)
private String Text;
}
I'm trying to parse this XML, which don't have any entries in the list:
<entries>
<entry />
<entries>
The follow error is returned:
W/System.err(3335): org.simpleframework.xml.core.ValueRequiredException: Unable to satisfy @org.simpleframework.xml.Element(data=false, name=entry_id, required=true, type=void) on field 'id' private long com.android.apps.model.Entry.id for class com.android.apps.model.Entry at line 2
What am I doing wrong? The ElementList is set empty = true and required = false. anybody can help?
You can check for empty elements manually:
@Root(name = "entries")
@Convert(List.ListConverter.class) // Set the converter
public class List
{
@ElementList(required = false, entry = "entry", inline = true, empty = true)
private java.util.List<Entry> entries;
public void add(Entry e)
{
// Just for testing
entries.add(e);
}
static class ListConverter implements Converter<List>
{
@Override
public List read(InputNode node) throws Exception
{
List l = new List();
InputNode child = node.getNext("entry");
while( child != null)
{
if( child.isEmpty() == true ) // child is an empty tag
{
// Do something if entry is empty
}
else // child is not empty
{
Entry e = new Persister().read(Entry.class, child); // Let the Serializer read the Object
l.add(e);
}
child = node.getNext("entry");
}
return l;
}
@Override
public void write(OutputNode node, List value) throws Exception
{
// Not required for reading ...
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
How to use:
Serializer ser = new Persister(new AnnotationStrategy()); // Set AnnotationStrategy here!
List l = ser.read(List.class, yourSourceHere);
Documentation:
To avoid the error in parse do one should place annotation tags @set e @get
@Root(name = "entries", strict = false)
public class List {
@set:ElementList(required = false, entry = "entry", inline = true, empty = true)
@get:ElementList(required = false, entry = "entry", inline = true, empty = true)
private List<Entry> entries;
}
@Root
public class Entry {
@set:Element(name = "entry_id", required = true)
@get:Element(name = "entry_id", required = true)
private long id;
@set:Element(name = "text", required = true)
@get:Element(name = "text", required = true)
private String Text;
}
来源:https://stackoverflow.com/questions/21581789/empty-entry-in-elementlist-simplexml