Как разобрать пустой элемент XML, если у него есть атрибуты?

1

Я использую библиотеку 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 равно null.

Как я могу заставить XStream все еще разобрать и создать экземпляр объекта Player чтобы я мог использовать атрибуты?

Изменить для ответа Аникет

Я использую метод 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);
    }

}
Теги:
xml-parsing
xstream

1 ответ

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

Надеюсь это поможет.

  • 0
    Я использую метод processAnnotations() . Пожалуйста, смотрите обновленный вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню