2011-07-28 110 views
2

當我有下不同的命名空間10點的模式,每一個的complexType和相關聯的元件,其爲所謂的「報告」的元素的取代,例如不工作<xsd:element name="Report" abstract="true"/>JAXB繼承解組

當我解組已經在所有10份報告的XML文檔,只有5當我做了以下發現:

JAXBContext context = JAXBContext.newInstance("com.foo.bar"); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
//get root node of xml 
JAXBElement<ReportPackage> package = unmarshaller.unmarshal(new StreamSource(new File("example.xml"))); 
ReportPackage rp = package.getValue(); 
ReportSection reports = rp.getReports(); 
List<JAXBElement<?>> reportList = reports.getReport(); 
//iterate through the 10 reports 
for (int i = 0; i < reportList.size(); i++) { 
    JAXBElement rep = reportList.get(i); 
    ... 
} 

這與xml中的報告順序或報告數量無關。 10種類型報告中的5種始終可以找到。我已經使用JAXB的參考實現2.24u1和2.1.10(JDK 6版本),都無濟於事。看起來替換組被忽略。任何幫助將非常感激!

+1

報告中只有特定類型的子類沒有解組嗎?是com.foo.bar jaxb.in​​dex或ObjectFactory中Report的所有子類嗎? – padis

+0

只有某些類型的「報告」未被解組。每種報告類型都在其自己的名稱空間中。例如, 'com.foo.bar.report1.Myreport1' 'com.foo.bar.report2.Myreport2' – michael

+0

Report的子類的相同類型(5/10)不會每次解組。 Report的每個子類都有其自己的名稱空間,模式和ObjectFactory類。 「ReportPackage」模式將所有這些不同的報告結合在一起,每個報告都可以替代抽象的「報告」元素。 ReportPackage有一個ObjectFactory類,它包含一個'createReport(Object obj)'方法。 – michael

回答

1

嘗試使用這種方法創建JAXB上下文:JAXBContext.newInstance("package1:package2:package3:...")其中packageX是您的ObjectFactory所在的包。

+0

謝謝padis。此解決方案工作。我已經嘗試過,但我一直在使用「;」作爲我的包裝分隔符。 – michael