【发布时间】:2015-07-11 16:22:11
【问题描述】:
我使用 xjc 将 .xsd 架构转换为 Java。然而,作为一个相当复杂的架构,生成的代码让我有些头疼。
在某些情况下,一个元素可以从几个不同但足够相似的复杂类型元素中选择多个子元素。在发生这种情况的情况下,xjc 的 get 方法会返回对 List<object> 的引用。
@XmlElements({
@XmlElement(name = "ATTRIBUTE-VALUE-EMBEDDED-DOCUMENT", type = ATTRIBUTEVALUEEMBEDDEDDOCUMENT.class),
@XmlElement(name = "ATTRIBUTE-VALUE-EMBEDDED-FILE", type = ATTRIBUTEVALUEEMBEDDEDFILE.class),
@XmlElement(name = "ATTRIBUTE-VALUE-ENUMERATION", type = ATTRIBUTEVALUEENUMERATION.class),
@XmlElement(name = "ATTRIBUTE-VALUE-FILE-REFERENCE", type = ATTRIBUTEVALUEFILEREFERENCE.class),
@XmlElement(name = "ATTRIBUTE-VALUE-SIMPLE", type = ATTRIBUTEVALUESIMPLE.class),
@XmlElement(name = "ATTRIBUTE-VALUE-XML-DATA", type = ATTRIBUTEVALUEXMLDATA.class)
})
protected List<Object> attributevalues;
/**
* Gets the value of the attributevalues property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the attributevalues property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getATTRIBUTEVALUES().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link ATTRIBUTEVALUEEMBEDDEDDOCUMENT }
* {@link ATTRIBUTEVALUEEMBEDDEDFILE }
* {@link ATTRIBUTEVALUEENUMERATION }
* {@link ATTRIBUTEVALUEFILEREFERENCE }
* {@link ATTRIBUTEVALUESIMPLE }
* {@link ATTRIBUTEVALUEXMLDATA }
*
*
*/
public List<Object> getATTRIBUTEVALUES() {
if (attributevalues == null) {
attributevalues = new ArrayList<Object>();
}
return this.attributevalues;
}
这让生活变得困难,因为我只对它可能包含的选择中的特定类型的元素感兴趣。
有什么方法可以让我在浏览列表时找出孩子的元素名称?我知道instanceof 和Object.getClass(),但有人告诉我在绝大多数情况下应该有比它们更好的方法。
这是我应该使用它们的情况之一,还是 JAXB 有一个工具可以检测元素名称而不使用它们中的任何一个?
【问题讨论】:
-
考虑使用JAXB2 Simplify Plugin 来简化生成的结构。您可以为每个元素获得一个属性,这将使您的生活更简单。免责声明:我是插件的作者。
-
@lexicore 还没有机会查看它,但是一旦我的所有功能都正常工作并正在调整算法,我肯定会试一试。