【问题标题】:JAXB variable attribute name, is it possible?JAXB 变量属性名,可以吗?
【发布时间】:2026-01-14 22:35:02
【问题描述】:

我必须制作这样的东西:

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

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

【问题讨论】:

标签: java jaxb


【解决方案1】:

你不能做你想做的事——正如 LINEMAN78 所说,变量属性名称不是有效的 XSD 构造。如果你知道你的候选属性列表由什么组成(例如,你的 Exts 可以有 Code、Name、Foo、Bar 和 Baz),你可以使用@XmlAttributes 来定义它们;默认情况下,XmlAttribute 不是必需的,如果 Java 对象值为 null,则不会显示在编组输出中。

【讨论】:

  • 唯一的缺点是不指定或指定所有属性仍然有效,因此没有继承验证。
【解决方案2】:

变量属性名称对于 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);

【讨论】:

    最近更新 更多