JAVA JAXB - XJC生成方法返回List <object> - 检测对象类型的最佳方法?

时间:2015-07-11 16:22:12

标签: java xml list object jaxb

我使用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;
    }

这使得生活变得困难,因为我只对它可能包含的选择中的特定类型的元素感兴趣。

当我查看列表时,有什么方法可以找出孩子的元素名称吗?我知道instanceofObject.getClass()但我被告知在绝大多数情况下应该有比他们更好的方式。

这是我应该使用它们的情况之一,还是JAXB有一个检测元素名称的工具而不诉诸其中任何一个?

1 个答案:

答案 0 :(得分:0)

在这种情况下,instanceof可能是你最好的选择。也就是说,如果所有元素都有一个共同的结构,你可以为它们创建一个公共接口。您可以添加到模式中的绑定,以获取xjc以将接口分配给相关类。那么你的列表应该是通用接口,而不仅仅是Object。但是,如果没有任何其他属性来区分类,那么您仍然可以使用“instanceof”来查找相关类型。

你可能会说服jaxb告诉你给定对象实例的元素名称(例如JAXBIntrospector),但是你的代码仍然只是一个巨大的元素名称开关,实际上并没有那么不同来自instanceof的一个巨大的开关。