【问题标题】:Correct way to parse XML using Simple Framework使用简单框架解析 XML 的正确方法
【发布时间】:2014-11-03 13:45:09
【问题描述】:

我正在使用 Simple 框架来反序列化我的 android 应用程序上的 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;
    }
}

并且记录我得到的列表的大小 4 这是正确的,但是如何以不同的方式获取每个对象,包括扩展名(属性)

请帮我解决这个问题。

谢谢

【问题讨论】:

  • 您应该突出显示版本之间的差异:-D 使用 diff 来实际看到它。

标签: java xml xml-parsing simple-framework


【解决方案1】:
@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>

解决方案:使用内联列表 - 那些没有“列表标签”。

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

    // ...
}

【讨论】:

  • 感谢 oLLo 的回答,我昨天确实解决了这个问题,我将在下面发布我的代码,但我认为你的更好,因此将其标记为正确答案。
【解决方案2】:

解决了我的问题并学到了很多关于简单框架的知识,它很棒而且重量很轻,但我更喜欢 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...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多