我使用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有一个检测元素名称的工具而不诉诸其中任何一个?
答案 0 :(得分:0)
在这种情况下,instanceof可能是你最好的选择。也就是说,如果所有元素都有一个共同的结构,你可以为它们创建一个公共接口。您可以添加到模式中的绑定,以获取xjc以将接口分配给相关类。那么你的列表应该是通用接口,而不仅仅是Object。但是,如果没有任何其他属性来区分类,那么您仍然可以使用“instanceof”来查找相关类型。
你可能会说服jaxb告诉你给定对象实例的元素名称(例如JAXBIntrospector),但是你的代码仍然只是一个巨大的元素名称开关,实际上并没有那么不同来自instanceof的一个巨大的开关。