JAXB распаковывает только глубоко вложенное подмножество XML-файла

Мое приложение получает очень длинный XML-документ, и я хотел бы использовать его для заполнения объекта Java.

Однако, несмотря на то, что в XML существует множество глубоко вложенных элементов, меня интересуют лишь некоторые из них. Меня также интересует только переход от XML к Java. Мне не нужна возможность сортировки моего Java-объекта обратно в XML.

Я хотел бы использовать для этого JAXB, если это возможно, поскольку зависимости моего приложения уже включают Eclipselink MOXy. Однако я не уверен, как получить только несколько глубоко вложенных значений элементов. Я посмотрел на аннотацию @XmlElementWrapper и подумал об использовании ее для аннотирования полей моего класса Java следующим образом:

...
@XmlElementWrapper(name="LEVEL_1/SUBLEVEL_1/YET_ANOTHER_SUBLEVEL")
@XmlElement(name="STATUS")
private String statusCode;
...

Однако я не знаю, допустим ли этот атрибут name. Я все равно не дошел до этого... компилятор говорит мне, что @XmlElementWrapper можно использовать только тогда, когда переменная-член является типом коллекции. Большинство полей, которые я пытаюсь извлечь, представляют собой одиночные значения.

Я попытался пропустить аннотацию @XmlElementWrapper и посмотреть, поймет ли только @XmlElement значения XPath:

...
@XmlElement(name="LEVEL_1/SUBLEVEL_1/YET_ANOTHER_SUBLEVEL/STATUS")
private String statusCode;
...

Хотя это не вызывает ошибки компиляции, это тоже не работает. Во время выполнения Eclipselink просто создает экземпляр моего объекта с null в этом поле.

Есть ли что-то, что мне не хватает, или то, что я пытаюсь сделать, вообще возможно с JAXB?


person Steve Perkins    schedule 17.08.2012    source источник


Ответы (1)


Это можно сделать с помощью EclipseLink JAXB (MOXy) с расширением @XmlPath.

@XmlPath("LEVEL_1/SUBLEVEL_1/YET_ANOTHER_SUBLEVEL/STATUS/text()")
private String statusCode;

Для получения дополнительной информации

person bdoughan    schedule 17.08.2012
comment
Спасибо! Однако вы можете отредактировать этот фрагмент кода. Оказывается, аннотация пути @XmlPath просто принимает строку пути... нет префикса name=. - person Steve Perkins; 17.08.2012
comment
@StevePerkins - Хороший улов, я исправил фрагмент. - person bdoughan; 17.08.2012