我必须制作这样的东西:
<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 =)将以某种方式使用变量。
答案 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);