0

我必须生产这样的东西:

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

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

4

2 回答 2

1

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

于 2013-04-29T21:29:54.470 回答
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);
于 2013-04-29T20:21:02.907 回答