将多个子 JAXBElement 放入父 JAXBElement
Put more than one child JAXBElement into parent JAXBElement
以下代码有效:
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
final JAXBElement<String> lv2elem =
new JAXBElement<String>(new QName("lv2"), String.class, "val1");
final JAXBElement lv1elem =
new JAXBElement(new QName("lv1"), JAXBElement.class, lv2elem);
custom.add(lv1elem);
}
return custom;
}
当封送对象时,它会产生以下 XML:
<xml>
<lv1>
<lv2>val1</lv2>
</lv1>
</xml>
如何让它产生多个lv2
元素?期望的输出:
<xml>
<lv1>
<lv2>val1</lv2>
<lv2>val2</lv2>
</lv1>
</xml>
最后我想创建一个带有动态标签的深度 XML 结构。
我试图将不同的 declaredType
和 value
传递给 lv1elem
的构造函数,但没有成功:
// class [Ljavax.xml.bind.JAXBElement; nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, new JAXBElement[] { lv2elem });
// [Ljavax.xml.bind.JAXBElement; is not known to this context
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement[].class, new JAXBElement[] { lv2elem });
// class java.util.Arrays$ArrayList nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, Arrays.asList(new JAXBElement[] { lv2elem } ));
通过使用具有 属性 类型 List<Object>
的中间 java bean Recurs
找到了解决方法。我仍然需要用 JAXBElement
包装 Recurs
以将标签名称从默认值 <recurs>
更改为所需的名称: <lv1>
。 Recurs
中的列表可以包含一个或多个 JAXBElement
,包括其他 JAXBElement<Recurs>
或 JAXB 上下文已知的其他类型。
public class Recurs {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
}
return custom;
}
public void setCustom(List<Object> custom) {
this.custom = custom;
}
}
@XmlRootElement
@XmlSeeAlso({ Recurs.class }) // !!! This is important
public class Xml {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
JAXBElement<String> lv2elem;
Recurs recurs = new Recurs();
for (int i = 1; i <= 2; i++) {
lv2elem = new JAXBElement<String>(new QName("lv2"), String.class, "val" + i);
recurs.getCustom().add(lv2elem);
}
JAXBElement lv1elem = new JAXBElement(new QName("lv1"), Recurs.class, recurs);
custom.add(lv1elem);
}
return custom;
}
}
以下代码有效:
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
final JAXBElement<String> lv2elem =
new JAXBElement<String>(new QName("lv2"), String.class, "val1");
final JAXBElement lv1elem =
new JAXBElement(new QName("lv1"), JAXBElement.class, lv2elem);
custom.add(lv1elem);
}
return custom;
}
当封送对象时,它会产生以下 XML:
<xml>
<lv1>
<lv2>val1</lv2>
</lv1>
</xml>
如何让它产生多个lv2
元素?期望的输出:
<xml>
<lv1>
<lv2>val1</lv2>
<lv2>val2</lv2>
</lv1>
</xml>
最后我想创建一个带有动态标签的深度 XML 结构。
我试图将不同的 declaredType
和 value
传递给 lv1elem
的构造函数,但没有成功:
// class [Ljavax.xml.bind.JAXBElement; nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, new JAXBElement[] { lv2elem });
// [Ljavax.xml.bind.JAXBElement; is not known to this context
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement[].class, new JAXBElement[] { lv2elem });
// class java.util.Arrays$ArrayList nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, Arrays.asList(new JAXBElement[] { lv2elem } ));
通过使用具有 属性 类型 List<Object>
的中间 java bean Recurs
找到了解决方法。我仍然需要用 JAXBElement
包装 Recurs
以将标签名称从默认值 <recurs>
更改为所需的名称: <lv1>
。 Recurs
中的列表可以包含一个或多个 JAXBElement
,包括其他 JAXBElement<Recurs>
或 JAXB 上下文已知的其他类型。
public class Recurs {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
}
return custom;
}
public void setCustom(List<Object> custom) {
this.custom = custom;
}
}
@XmlRootElement
@XmlSeeAlso({ Recurs.class }) // !!! This is important
public class Xml {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
JAXBElement<String> lv2elem;
Recurs recurs = new Recurs();
for (int i = 1; i <= 2; i++) {
lv2elem = new JAXBElement<String>(new QName("lv2"), String.class, "val" + i);
recurs.getCustom().add(lv2elem);
}
JAXBElement lv1elem = new JAXBElement(new QName("lv1"), Recurs.class, recurs);
custom.add(lv1elem);
}
return custom;
}
}