我有一些XSD,我通过XJC从中创建了Java代码。我可以通过提供的“直接映射”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"/>
...
因此'description'的类型应该是JAXBElement&lt; TextType&gt;。 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();
....
但问题是我现在不知道如何获取'cost'元素的内容。在TextType.java的getContent()方法之上,它说:
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link String }
* {@link Object }
'cost'元素的内容必须存储在某种列表中,因为'description'父级下可以有多个。
答案 0 :(得分:1)
@XmlAnyElement(lax=true)
表示如果遇到的元素对应于类的根元素(使用@XmlRootElement
或@XmlElementDecl
映射,则将创建该对象的实例,否则数据将是保留为DOM节点。
@XmlMixed
@XmlAnyElement(lax = true)
protected List<Object> content;
了解更多信息
答案 1 :(得分:0)
我的上帝是什么样的旅行...'cost'元素被映射到com.sun.org.apache.xerces.internal.dom.ElementNSImpl。我不知道为什么......但我现在可以了解所需的信息。