使用简单框架解析XML的正确方法

问题描述:

我正在使用简单框架反序列化我的android应用程序上的xml。使用简单框架解析XML的正确方法

问题出在xml的一部分上,因为我可以获取其他部分的对象。

这里是我挣扎的XML的一部分:

<webtv name="channelname" date="2014-10-31"> 
     <config> 
       <pathVideo extension="mp4">http://vodflash.channelname.com/tv_conn/1/country/</pathVideo> 
       <pathBigImage extension="jpg">http://vodflash.channelname.com/tv_conn/1/country/pic/320x180/</pathBigImage> 
       <pathImage extension="jpg">http://vodflash.channelname.com/tv_conn/1/country/pic/160x90/</pathImage> 
       <pays>GB;IE</pays> 
      </config> 

这里是我XmlMapper类:

@Root(name="webtv", strict = false) 
public class XmlModelMapper { 

    public ConfigObject getConfigObjects() { 
     return configObject; 
    } 

    @Element(name="config") 
    public ConfigObject configObject = new ConfigObject(); 


    @ElementList(name = "itemList") 
    private List<Videos> itemList = new ArrayList<Videos>(); 
    public List<Videos> getItemList() { 
     return itemList; 
    } 

    @ElementList(name = "chaineList") 
    private List<Chaine> chaineList = new ArrayList<Chaine>(); 
    public List<Chaine> getChaineList() { 
     return chaineList; 
    } 
} 

如果我改变我的映射类这样的:

@Root(name="webtv", strict = false) 
public class XmlModelMapper { 

    public List<ConfigObject> getConfigObjects() { 
     return configObject; 
    } 

    //change is here using a list not an object 
    @ElementList(name="config") 
    public List<ConfigObject> configObjects = new ArrayList<ConfigObject>(); 


    @ElementList(name = "itemList") 
    private List<Videos> itemList = new ArrayList<Videos>(); 
    public List<Videos> getItemList() { 
     return itemList; 
    } 

    @ElementList(name = "chaineList") 
    private List<Chaine> chaineList = new ArrayList<Chaine>(); 
    public List<Chaine> getChaineList() { 
     return chaineList; 
    } 
} 

和日志大小的List我得到4这是正确的,但如何以不同的方式获得每个对象,包括t他的扩展(属性)

请帮我解决这个问题。

感谢

+1

您应该突出版本之间的差异:-D使用一个* DIFF *实际看到它。 – ollo 2014-11-05 19:55:16

@ElementList(name="config") 
public List<ConfigObject> configObjects = new ArrayList<ConfigObject>(); 

这不会匹配上面列出你的XML。基于@Element的解决方案(示例1)将创建一个合适的config-tag,该列表将添加另一个“list-tag”;这里有一个例子:

<config> <!-- This is the list's tag, wrapping all elements --> 
    <config> <!-- This is the actual element's tag --> 
     <pathVideo extension="mp4">http://video.com</pathVideo> 
     <pathBigImage extension="jpg">http://bigimg.com</pathBigImage> 
     <pathImage extension="jpg">http://image.com</pathImage> 
     <pays>GB;IE</pays> 
    </config> 

    <!-- some more <config>...</config> --> 
</config> 

解决办法:用athe 直列名单 - 那些不具备“列表标签”。

@ElementList(name = "config", inline = true, entry = "config") 
public List<ConfigObject> configObjects = new ArrayList<>(); 

为了完整起见,这里使用我的班来进行测试:

class Chaine { /* empty - enough for testing */ } 

class Videos { /* empty - enough for testing */ } 


@Root 
public class ConfigObject 
{ 
    @Element(name = "pathVideo") 
    private PathConfig video; 
    @Element(name = "pathBigImage") 
    private PathConfig bigImage; 
    @Element(name = "pathImage") 
    private PathConfig image; 
    @Element(name = "pays") 
    private String pays; 

    // ... 
} 


@Root 
public class PathConfig 
{ 
    @Attribute(name = "extension") 
    private String extension; 
    @Text 
    private String path; 

    // ... 
} 
+0

谢谢oLLo的回答,我昨天设法解决了这个问题,我会在下面发布我的代码,但我认为你的更好,因此将其标记为正确答案。 – moujib 2014-11-05 23:33:26

解决了我的问题,很多了解简单的框架,这是伟大的,重量轻,但我更喜欢OLLO的答案 请丢弃ormlite注释 我的课:

@Root(name="webtv", strict = false) 
public class XmlModelMapper { 

    public ConfigObject getConfigObject() { 
     return configObject; 
    } 

    @Element(name="config") 
    public ConfigObject configObject = new ConfigObject(); 


    //rest of the elements 
    ... 


} 

@Root(name = "config" , strict = false) 
public class ConfigObject { 


    @Element 
    PathVideo pathVideo; 

    @Element 
    PathImage pathImage; 

    @Element 
    PathBigImage pathBigImage ; 


    //rest of the elements 
} 

@Root(name = "pathImage") 
@DatabaseTable(tableName = "imageconfig") 
public class PathImage { 

    @DatabaseField(generatedId = true) 
    Integer id ; 


    @Attribute 
    @DatabaseField 
    String extension; 

    @Text 
    @DatabaseField 
    String pathImage; 


    //rest of the elements... 
} 

@Root(name = "pathVideo") 
@DatabaseTable(tableName = "videoconfig") 
public class PathVideo { 

    @DatabaseField(generatedId = true) 
    Integer id ; 

    @Attribute 
    @DatabaseField 
    String extension; 

    @Text 
    @DatabaseField 
    String pathVideo; 


} 

最后

@Root(name = "pathBigImage") 
@DatabaseTable(tableName = "bigimageconfig") 
public class PathBigImage { 


    @DatabaseField(generatedId = true) 
    Integer id ; 

    @Attribute 
    @DatabaseField 
    String extension; 

    @Text 
    @DatabaseField 
    String pathBigImage; 

    //rest of the elements... 
}