Java JAXB变量属性名,可能吗?

Java JAXB变量属性名,可能吗?,java,jaxb,Java,Jaxb,我必须制作这样的东西: <Doc p1="something"> <Ext code="one"/> <Ext name="two"/> </Doc> <complexType name="Doc"> <sequence> <choice maxOccurs="unbounded"> <element name="Code" type="st

我必须制作这样的东西:

<Doc p1="something">
    <Ext code="one"/>
    <Ext name="two"/>
</Doc>
<complexType name="Doc">
    <sequence>
        <choice maxOccurs="unbounded">
            <element name="Code" type="string" />
            <element name="Name" type="string" />
        </choice>
    </sequence>
    <attribute name="p1" type="string" />
</complexType>
new JAXBElement<String>(new QName( "", "Name" ), String.class, Doc.class, value);


我知道如何使用我的Doc类完成这个部分,“code”和“name”只是Doc的属性,所以我打算创建一个包装类Ext来生成该元素,但我不确定如何在一种情况下使用“code”作为属性,在另一种情况下使用“name”作为属性。我想我总是可以创建两个不同的包装器类,但我想知道是否有更简单的方法,比如用某种方式设置变量的@XmlAttribute(name=)是什么。

变量属性名称对于xml架构定义无效,但您可以选择元素,因此它是:

<Doc p1="something">
    <Code>one</Code>
    <Name>two</Name>
</Doc>
要做到这一点,您将使用JaxbElement,它不需要包装器类。xsd将如下所示:

<Doc p1="something">
    <Ext code="one"/>
    <Ext name="two"/>
</Doc>
<complexType name="Doc">
    <sequence>
        <choice maxOccurs="unbounded">
            <element name="Code" type="string" />
            <element name="Name" type="string" />
        </choice>
    </sequence>
    <attribute name="p1" type="string" />
</complexType>
new JAXBElement<String>(new QName( "", "Name" ), String.class, Doc.class, value);

这将导致以下代码:

@XmlElementRefs({
    @XmlElementRef(name = "Code", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "Name", type = JAXBElement.class, required = false)
})
protected List<JAXBElement<String>> codeOrName;
@xmlementrefs({
@xmlementref(name=“Code”,type=JAXBElement.class,required=false),
@xmlementref(name=“name”,type=JAXBElement.class,required=false)
})
受保护列表代码或名称;
在使用JaxbElement时,如下所示:

<Doc p1="something">
    <Ext code="one"/>
    <Ext name="two"/>
</Doc>
<complexType name="Doc">
    <sequence>
        <choice maxOccurs="unbounded">
            <element name="Code" type="string" />
            <element name="Name" type="string" />
        </choice>
    </sequence>
    <attribute name="p1" type="string" />
</complexType>
new JAXBElement<String>(new QName( "", "Name" ), String.class, Doc.class, value);
newjaxbelement(newqname(“,“Name”)、String.class、Doc.class、value);

您无法执行您试图执行的操作-正如LINEMAN78所说,变量属性名称不是有效的XSD。如果您知道候选属性列表由什么组成(例如,您的ext可以有Code、Name、Foo、Bar和Baz),您可以使用@xmltattributes来定义它们;默认情况下,不需要
xmltattribute
,如果Java对象值为
null
,则不会显示在编组输出中。

尝试查看此[单击此处][1][1]:完全不同的问题唯一的缺点是指定任何或所有属性仍然有效,因此没有继承验证。