我使用XStream库将XML解析为对象。我的问题是XML模式(不可否认它不是很好,但它也不受我的控制)指定某个元素的所有数据都包含在其属性中,如下所示:
<Player machineIdentifier="41412kj423nkj234" platform="Chrome" product="Plex Web" state="playing" title="Plex Web (Chrome)" />
我的Player
元素类:
@XStreamAlias("Player")
public class Player {
@XStreamAlias("platform")
@XStreamAsAttribute
private String platform;
@XStreamAlias("product")
@XStreamAsAttribute
private String product;
@XStreamAlias("title")
@XStreamAsAttribute
private String name;
// Getters-setters ommited for brevity
}
由于元素在技术上是空的,XStream.fromXML()
会生成一个Player
字段为空的对象。
如何让XStream仍然解析并实例化Player
对象,以便我可以使用这些属性?
编辑Aniket的回答
我正在使用processAnnotations()
方法。由于实际模式不仅仅是Player
元素,因此在不处理注释的情况下甚至无法工作。
我的&#34;客体化&#34; class(我已经做了更多的通用,因为我正在使用多个模式):
public class XMLObjectifier {
// Other models omitted for brevity
private Class[] sessionModel = new Class[]{
PlexSessionResponse.class,
Player.class,
User.class,
Video.class
};
public Object toObject(String xml, ModelType type) {
XStream xStream = new XStream();
xStream.ignoreUnknownElements();
switch (type) {
case STATUS:
xStream.processAnnotations(statusModel);
break;
case SESSION:
xStream.processAnnotations(sessionModel);
break;
}
return xStream.fromXML(xml);
}
}
答案 0 :(得分:0)
我试图重现你的问题。
首先我做了
public static void main(String args[]){
File file = new File("C:\\Users\\athakur\\Desktop\\data.txt");
XStream xStream = new XStream(new DomDriver());
Player player = (Player) xStream.fromXML(file);
System.out.println(player.getName() + " : " + player.getPlatform() + " : " + player.getProduct());
}
我得到的输出是 -
null:null:null
这正是你所面对的。你需要做的是提前给xstream实例提供Player类的信息,以便正确地解组。以下代码为我工作 -
public static void main(String args[]){
File file = new File("C:\\Users\\athakur\\Desktop\\data.txt");
XStream xStream = new XStream(new DomDriver());
xStream.processAnnotations(Player.class); // This is required
Player player = (Player) xStream.fromXML(file);
System.out.println(player.getName() + " : " + player.getPlatform() + " : " + player.getProduct());
}
输出是 -
Plex Web(Chrome):Chrome:Plex Web
希望这有帮助。