Я демонтирую сложный объект из XML в Java, используя JAXB. Проблемная часть XML выглядит следующим образом:
<product>
<!-- SNIP -->
<keywords>
<keyword optionalAttribute="attrValue">Value</keyword>
<keyword>Another value</keyword>
</keywords>
</product>
У меня есть класс Java для родительского объекта и для сложных атрибутов, включая ключевые слова, с аннотациями javax.xml.bind.annotation.*
.
@XmlRootElement(name = "product")
@XmlAccessorType(XmlAccessType.NONE)
public class Product extends Model {
// SNIP
@XmlElementWrapper(name = "keywords")
@XmlElement(name = "keyword")
public List<ProductKeyword> keywords;
}
@XmlRootElement(name = "keyword")
@XmlAccessorType(XmlAccessType.NONE)
public class ProductKeyword extends Model {
@XmlAttribute(name = "optionalAttribute")
public String optionalAttribute;
@XmlMixed
public String keyword;
}
Поле ProductKeyword.keyword
должно содержать значение элемента <keyword>
, который является корневым элементом для подкласса. @XmlMixed
, похоже, не побуждает JAXB пытаться разобрать что-либо в этом поле.
Я считаю, что мне нужно @XmlValue
, но эту аннотацию нельзя использовать на подклассе (если, возможно, суперкласс не помечен @XmlTransient
.)
Кто-нибудь может предложить способ обойти это?
Ограничения:
Я не могу изменить формат XML.
Я не могу избавиться от суперкласса Model
(необходим для постоянства)
Я не могу изменить суперкласс (из внешней библиотеки)
Не ограничения:
Я могу, если нужно, добавить дополнительные поля в родительские или дочерние классы Java.
Если я могу получить значения ключевых слов в классе в любой форме или любым способом, я могу выполнить любую последующую обработку, необходимую для получения его в нужном месте / формате.
Это не должно быть красиво.