在我的一个应用程序中,我使用gamesdb.net的API来下载某些游戏的封面图像。要从XML文件中获取信息,我正在尝试实现Simple 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;
}
}
答案 0 :(得分:1)
您还可以使用JAXB
来(de)序列化XML(或者在他们调用时将其编组为(un)marshal)。它带有java - 因此不需要额外的库。这里有example。
答案 1 :(得分:1)
我认为您需要在自己的文件(数据和游戏)中声明您的类,或将它们标记为static
。如果将它们声明为内部类,则它们不能由库构造,因为它们只能存在于父类的实例中。
答案 2 :(得分:0)
这与您的XML无关,您使用的库似乎有问题(无法创建某个类的新实例)。请考虑重新下载并再次将其添加到项目中。
答案 3 :(得分:0)
SimpleXML网站上的教程显示了注释的不完整和不准确的使用。
我更新了我的代码,检查我的答案底部以获得正确的实现。我们严格建议您在注释中使用name="Name"
,如果您不需要Elements
/ Attributes
在课程中使用strict=false
,则必须使用= false你的元素或属性。