使用简单框架解析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他的扩展(属性)
请帮我解决这个问题。
感谢
答
@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...
}
您应该突出版本之间的差异:-D使用一个* DIFF *实际看到它。 – ollo 2014-11-05 19:55:16