我得到了一个xsd,我从中生成了JaxB-Classes(例如ApplicationCustomType)。有些类有一个xs:any as元素。我可以在这些字段中添加内容(例如xs:any)。编组运作良好。
但是当我试图解散它时
FullContent contentType = XmlObjectHelper.getXmlTypeFromString(contentType, FullContent.class);
JaxB类没有填充每个xs:any的字段。所有其他字段应该填写,但xs:any的绑定似乎不起作用。
我读到了serializing-with-jaxb的答案,它看起来很相似,我觉得我没有忘记。 我还尝试添加lax = true但是它再次没有解组我的xml。
我做错了什么或忘记了什么?
public class ApplicationCustomType {
@XmlAnyElement
protected List<Element> any;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
示例xs:any element。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "addressAttachment", propOrder = {
"locale",
"ourUserId"
})
public class AddressAttachment {
@XmlElement(required = false)
protected String locale;
@XmlElement(required = false)
protected String ourUserId;
}
ObjectFactory.java
@XmlElementDecl(namespace = "http://***/xsd/addressAttachment/v1", name = "information")
public JAXBElement<AddressAttachment> createAddressAttachment(AddressAttachment value) {
return new JAXBElement<AddressAttachment>(_AddressAttachment_QNAME, AddressAttachment.class, null, value);
}
我收到的xml:
<content>
<applicationCustom>
<addressAttachment>
<locale>CH.de</locale>
<ourUserId>264646337383839</ourUserId>
</addressAttachment>
</applicationCustom>
</content>
解决方案:
我们在列表顶部使用(lax = true)重试它而不是类。
public class ApplicationCustomType {
@XmlAnyElement(lax = true)
protected List<Element> any;
如果您使用<Element>
或<Object>
不会影响结果。使用Element
时,您实际上不必为编组提供类。但在这两种情况下,您需要为对象工厂中的每个@XmlElementDecl
类添加XMLRoot
,以便为要添加到xs:any列表的每个对象添加。{/ p>
答案 0 :(得分:1)
尝试像这样使用它:
@XmlAnyElement
protected List<Object> any;
看看里面是什么!
解释如下:https://dzone.com/articles/jaxbs-xmlanyelementlaxtrue
你还应该向unmarshaller提供已知类(AddressAttachment.class ...),否则它无法找出xml中的内容是什么?
在您的示例中未显示但应如下所示:
JAXBContext.newInstance(FullContent.class,AddressAttachment.class ...);
使用Any在根对象本身中没有引用。
与Jaxb共度美好时光