为什么xs:任何不使用jaxb类的autobind?

时间:2015-09-03 09:45:30

标签: java xml xsd jaxb unmarshalling

我得到了一个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>

1 个答案:

答案 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共度美好时光