JAXB变量属性名称,有可能吗?

时间:2013-04-29 20:02:00

标签: java jaxb

我必须制作这样的东西:

<Doc p1="something">
    <Ext code="one"/>
    <Ext name="two"/>
</Doc>

我知道如何使用我的Doc类,&#34;代码&#34;和&#34;名称&#34;只是Doc的属性,所以我打算创建一个包装类Ext来生成该元素,但我不确定如何使用&#34; code&#34;作为一个案例中的属性和&#34; name&#34;作为另一种情况的属性。我总是可以创建两个不同的包装类,但我想知道是否有更简单的方法,比如某种方式来设置@XmlAttribute(name =)将以某种方式使用变量。

2 个答案:

答案 0 :(得分:1)

你无法做你想做的事 - 正如LINEMAN78所说,变量属性名称不是有效的XSD make。如果您知道候选属性列表包含哪些内容(例如,您的Exts可以包含Code,Name,Foo,Bar和Baz),则可以使用@XmlAttribute来定义它们;默认情况下,不需要XmlAttribute,如果Java对象值为null,则不会显示在编组输出中。

答案 1 :(得分:0)

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

<Doc p1="something">
    <Code>one</Code>
    <Name>two</Name>
</Doc>

为此,您将使用JaxbElement,它不需要包装类。 xsd看起来像这样:

<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>

这将导致以下代码:

@XmlElementRefs({
    @XmlElementRef(name = "Code", type = JAXBElement.class, required = false),
    @XmlElementRef(name = "Name", type = JAXBElement.class, required = false)
})
protected List<JAXBElement<String>> codeOrName;

使用JaxbElement的方式如下:

new JAXBElement<String>(new QName( "", "Name" ), String.class, Doc.class, value);