【问题标题】:How to parse an empty XML element if it has attributes?如果它有属性,如何解析一个空的 XML 元素?
【发布时间】:2015-06-02 06:42:30
【问题描述】:

我正在使用 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 元素,因此如果不处理注释,它甚至无法工作。

我的“objectifier”类(因为我正在使用多个模式,所以我做了更通用的):

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);
    }

}

【问题讨论】:

    标签: java xml xml-parsing xstream


    【解决方案1】:

    我试图重现你的问题。

    首先我做到了

    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());
    }
    

    我得到的输出是 -

    空:空:空

    我猜这正是你所面临的。您需要做的是事先为 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

    希望这会有所帮助。

    【讨论】:

    • 我确实使用processAnnotations() 方法。请查看更新后的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多