2012-10-16 38 views
4

我有类似如下的模式...JAXB可以处理多个“根”元素吗?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="t1" type="t1Type"/> 
    <xs:element name="t2" type="t2Type"/> 
    <xs:element name="t3" type="t3Type"/> 
</xs:schema> 

起初我以为这是一个无效的架构,但我做的在线验证它的检查。这意味着提供XML的人可以发送列出的任何(或全部)类型,并且仍然符合该模式。

如何使用JAXB进行映射和解组所有不同的可能性?

我不知道他们哪一个我会收到。

回答

4

您需要充分利用用@XmlRegistry注解的工厂类(通常称为ObjectFactory)。该类将包含用@XmlElementDecl注解的每个可能根元素的create方法。

+0

在示例中提供了您知道哪种类型您正在接收如果我不知道会发生什么情况?我可以得到任何类型返回我如何unmarshall? – Jackie

+2

@Jackie - 您不需要知道执行解组操作的对象类型。如果你不知道你在编组什么,你需要对'getClass()'''''instanceof''来确定你有什么,然后才能对数据执行任何类型特定的调用。 –

+1

第二部分是我需要的感谢!好博客文章顺便说一句。 – Jackie

0

我是newbee到JAXB。 我有关于JAXB

@XmlElementDecl(namespace = "http://mtop/nra/xsd/tca/v1", name = "thresholdCrossingAlert", substitutionHeadNamespace = "http://mtop/fmw/xsd/cei/v1", substitutionHeadName = "commoneventInformation") 

这是我得到的异常,因为

"java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions" 

ThresholdCrossingAlert.class是扩展类EventInformationType.classEventInformationType.class是inturn扩展类CommonEventInformation.class注释一个疑问,

这是我的注释定义或初始化JaxbContext错误的任何问题。