JAXB - не удается получить доступ к некоторой информации об объекте

У меня есть несколько XSD, из которых я создал код Java через XJC. Я могу получить много информации через предоставляемые POJO "прямого сопоставления" XJC. Большую часть остальных можно получить с помощью JAXBElements. Однако есть несколько элементов, из которых я просто не знаю, как с ними разговаривать, а именно элементы "стоимость" в родительском элементе "транзакция / описание".

<transaction>
  <aid-type code="1995-09-25"/>
  <flow-type code="10">ODA</flow-type>
  <provider-org ref="DE-1">BMZ</provider-org>
  <value currency="EUR" value-date="1995-09-25">2070227</value>
  <transaction-type code="D">Disbursement</transaction-type>
  <description type="1" xml:lang="en">
    <costs currency="EUR" type="Personnel costs">1060135</costs>
    <costs currency="EUR" type="Material costs">665117</costs>
    <costs currency="EUR" type="Other costs">344975</costs>
  </description>
</transaction>

Как видите, Transaction.java содержит элемент 'description' и сопоставляет его с JAXBElement.class.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"valueOrDescriptionOrTransactionType"
})
@XmlRootElement(name = "transaction")
public class Transaction {

@XmlElementRefs({
    @XmlElementRef(name = "transaction-date", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "value", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "disbursement-channel", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "receiver-org", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "transaction-type", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "description", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "tied-status", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "aid-type", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "finance-type", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "provider-org", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "flow-type", type = JAXBElement.class, required = false)
})
@XmlAnyElement(lax = true)
protected List<Object> valueOrDescriptionOrTransactionType;
@XmlAttribute(name = "ref")
protected String ref;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();

Поверх Transaction.java фрагмент схемы говорит:

...
&lt;element name="description" type="{}textType"/>
...

Поэтому типом "описания" должен быть JAXBElement. TextType.java выглядит так:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "textType", propOrder = {"content"})
public class TextType {

@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace")
protected String lang;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();

Теперь, чтобы получить информацию из транзакции, я создаю объект транзакции и извлекаю его содержимое:

 List<Object> listOfTransactionContents = transaction.getValueOrDescriptionOrTransactionType();

Это дает мне список, в котором я ищу объекты JAXBElement.

for (Object obj : listOfTransactionContents)
{
    JAXBElement<TextType> jaxbElementTextType = (JAXBElement<TextType>) obj;
    TextType textType = jaxbElementTextType.getValue();
    List<Object> listOftTextTypes = textType.getContent();
    ....

Но вот проблема, я не знаю, как получить содержимое элементов "стоимость" сейчас. Над методом getContent() TextType.java написано:

 * Objects of the following type(s) are allowed in the list
 * {@link Element }
 * {@link String }
 * {@link Object }

Содержимое элементов 'cost' должно храниться в каком-то списке, потому что их может быть несколько в родительском элементе 'description'.

2 ответа

Решение

Боже мой, что поездка... элементы 'затрат' отображаются на com.sun.org.apache.xerces.internal.dom.ElementNSImpl. Я не знаю почему... но сейчас я получаю необходимую информацию.

@XmlAnyElement(lax=true) означает, что если встреченный элемент соответствует корневому элементу класса (сопоставлен с @XmlRootElement или же @XmlElementDecl тогда будет создан экземпляр этого объекта, в противном случае данные будут храниться как узлы DOM.

@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;

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

Другие вопросы по тегам