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 фрагмент схемы говорит:
...
<element name="description" type="{}textType"/>
...
Поэтому типом "описания" должен быть JAXBElement
@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;
Для дополнительной информации