@XmlAnyElement(lax = true)用简单的英语意思是:
亲爱的JAXB!如果您有此元素的映射,请将其解组为Java对象。如果您不知道此元素,请将其保留为DOM元素。
这正是您的情况。因此,如果您想实际解组此松散内容的内容,请为JAXB上下文提供要解组的元素的映射。最简单的方法是用
@XmlRootElement
@XmlRootElement(name="foo", namespace="urn:bar")public class MyClass { ... }现在,当您创建JAXB上下文时,添加
MyClass到其中:
JAXBContext context = JAXBContext.newInstance(A.class, B.class, ..., MyClass.class);
在这种情况下,如果JAXB
{urn:bar}foo在那个位置遇到元素xs:any,它将知道该元素已映射到该元素
MyClass,并尝试解组MyClass。
如果要基于包名称创建JAXB上下文(您可能会这样做),则仍可以向其中添加类(例如
com.acme.foo.MyClass)。最简单的方法是创建
com/acme/foo/jaxb.index资源:
com.acme.foo.MyClass
并将您的包名称添加到上下文路径:
JAXBContext context = JAXBContext.newInstance("org.dar.gee.schema:com.acme.foo");等还有其他方法
ObjectFactory,但是窍门
jaxb.index可能是最简单的方法。
另外,您也可以将
xs:anyas DOM
的内容保留为DOM,然后通过JAXB上下文(知道您的
MyClass类)进行第二次解组,而不用一次将所有内容解组。就像是:
JAXBContext payloadContext = JAXBContext.newInstance(MyClass.class);payloadContext.createUnmarshaller().unmarshal((Node) myPayload.getAny());
这种方法有时会更好,特别是当您具有相对独立的容器/有效负载方案组合时。视情况而定。
上述所有内容也适用于编组。全部都是双向的。



