2015-03-29 3 views
1

Я использую библиотеку XStream для анализа XML в объекты. Моя проблема заключается в том, что 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, чтобы я мог использовать атрибуты?

Edit для ответа Аникет в

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

} 

ответ

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

и выход я получил -

нуль: нуль: нулевой

это именно то, что вы столкнулись, я думаю. Что вам нужно сделать, так это предоставить экземпляр 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() '. См. Обновленный вопрос. – j0ntech

 Смежные вопросы

  • Нет связанных вопросов^_^