2012-10-16 36 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錯誤的任何問題。