2014-02-05 38 views
3

我的问题很简单,但我无法找到它。元素列表中的空条目SimpleXML

我有一个列表类和XML序列化的入门级:

@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; 
} 

我试图解析这个XML,它没有在列表中的条目:

<entries> 
    <entry /> 
<entries> 

返回以下错误:

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 

我在做什么错? ElementList被设置为空= true并且必需= false。 有人可以帮忙吗?

+0

它确实有一个列表,它虽然空单,因此未通过检查有一个id属性。所以你真正的问题是为什么输出中的空标签? –

+0

我明白了。 XML由另一个系统生成。在这种情况下,我想知道如果简单的框架有一些方法来识别列表中的空项目并忽略它。有没有办法? –

+0

不是我所知道的,也不能想到有它的理由。唯一我能想到的。是1)报告这是一个错误2)修复Xml反序列化之前。 –

回答

0

您可以检查手动空元素:

@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."); 
     } 
    } 
} 

如何使用:

Serializer ser = new Persister(new AnnotationStrategy()); // Set AnnotationStrategy here! 
List l = ser.read(List.class, yourSourceHere); 

文档:

+0

如果列表中完全填充空标签,则此解决方案不起作用。你能改善你的答案吗? – GreenThor

0

为了避免解析错误不应该把注释标签@setË@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; 
} 
+0

你应该用英文在你的答案上写上你的答案 – Heyji