1

在我的一个应用程序中,我使用 thegamesdb.net 的 API 来下载一些游戏的封面图片。为了从 XML 文件中获取信息,我正在尝试实现简单的 XML库来反序列化。

这是我的示例查询结果(name=Splatterhouse,platform=TurboGrafx 16):

<?xml version="1.0" encoding="UTF-8" ?>
<Data>
    <Game>
        <id>3776</id>
        <GameTitle>Splatterhouse</GameTitle>
        <ReleaseDate>01/01/1990</ReleaseDate>
        <Platform>TurboGrafx 16</Platform>
    </Game>
</Data>

这就是我在java中实现我的类的方式:

@Root
public class Data{
    @ElementList(inline=true)
    private List<Game> list; //This is correct, it's only in the example that I've only one result.
    public List<Game> getGames(){
        return list;
    }
}
@Root
public class Game{
    @Element
    private int id;
    @Element
    private String GameTitle;
    @Element(required=false)
    private String ReleaseDate;
    @Element(required=false)
    private String Platform;
    public String getTitle(){
        return GameTitle;
    }
    public int getId(){
        return id;
    }
}

要从 xml 文件中读取,我调用序列化程序:

String xml = getXmlFromUrl(URL);
Serializer serializer = new Persister();
Data data = serializer.read(Data.class, xml);

怎么了?

更新:简单站点上的教程有点不完整,因为它们没有正确设置注释,这些注释解决了我所有的问题,加上所有警告都是“正常的”,很简单地说 jaxp 不存在android 并且将使用其他工具(XmlPullParser?)。

这是我的正确代码:

@Root(name = "Data")
public class Data {
    @ElementList(inline = true, required = false)
    private List<Game> list = new ArrayList<Game>();

    public List<Game> getGames() {
        return list;
    }
}

@Root(name = "Game", strict = false)
public class Game {
    @Element(name = "id")
    private int id;
    @Element(name = "GameTitle")
    private String GameTitle;

    public String getTitle() {
        return GameTitle;
    }

    public int getId() {
        return id;
    }
}
4

4 回答 4

1

您还可以使用JAXB(反)序列化 XML(或他们称之为(取消)编组)。它带有 java - 所以不需要额外的库。这里有一个例子

于 2013-09-02T15:09:13.007 回答
1

我相信您需要在自己的文件(数据和游戏)中声明您的类,或者将它们标记为static. 如果将它们声明为内部类,则库无法构造它们,因为它们只能存在于父类的实例中。

于 2013-09-02T15:12:21.233 回答
0

SimpleXML 网站上的教程显示了注释的不完整和不准确使用。我更新了我的代码,检查我的答案底部以获得正确的实现。严格建议name="Name"您在注释中使用,如果您不需要类上的所有Elements/Attributes使用strict=false和元素或属性上的 required=false 。

于 2013-09-03T05:42:01.943 回答
0

这与您的 XML 无关,您使用的库似乎有问题(无法创建某个类的新实例)。考虑重新下载它并再次将其添加到您的项目中。

于 2013-09-02T15:03:12.193 回答