Я использую библиотеку 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);
}
}
Я попытался воспроизвести вашу проблему.
Сначала я сделал
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
Надеюсь это поможет.
processAnnotations()
. Пожалуйста, смотрите обновленный вопрос.