[英]JAXB Reach Nested XmlElement Example
這是我的XmlRoot類:
@XmlRootElement(name = "IGE") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "IGEType", propOrder = { "altin" }) public class IGEType { @XmlElement(name = "ALTIN", required = true) protected List<ALTINType> altin; public List<ALTINType> getALTIN() { if (altin == null) { altin = new ArrayList<ALTINType>(); } return this.altin; } }
然后是root的后繼(子)類:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "ALTINType", propOrder = { "seanSytl" }) public class ALTINType { @XmlElement(name = "SEANSytl", required = true) protected SEANSytlType seanSytl; }
最后,root的繼承者的繼承者類:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "SEANSytlType", propOrder = { "birim", "oncekiKapanis", "enDusuk", "enYuksek", "kapanis", "agirlikliOrtalama", "islemHacmi", "islemMiktari", "bicim", "gram", "islemSayisi" }) public class SEANSytlType { @XmlElement(required = true) protected String birim; @XmlElement(name = "onceki_kapanis", required = true) protected BigDecimal oncekiKapanis; @XmlElement(name = "en_dusuk", required = true) protected BigDecimal enDusuk; @XmlElement(name = "en_yuksek", required = true) protected BigDecimal enYuksek; @XmlElement(required = true) protected BigDecimal kapanis; @XmlElement(name = "agirlikli_ortalama", required = true) protected BigDecimal agirlikliOrtalama; @XmlElement(name = "islem_hacmi", required = true) protected BigDecimal islemHacmi; @XmlElement(name = "islem_miktari", required = true) protected BigDecimal islemMiktari; @XmlElement(name = "BICIM", required = true) protected BigDecimal bicim; @XmlElement(name = "GRAM", required = true) protected BigDecimal gram; @XmlElement(name = "islem_sayisi") protected int islemSayisi; }
Myhandler類:
@Override public void handleXMLtoIABData(RequestTcmbXMLData req) throws HmnServiceException { try { JAXBContext jaxbContext = JAXBContext.newInstance(IGEType.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); File XMLfile = new File("C:\\\\Users\\\\U067944\\\\Desktop\\\\IAB_bülten.xml"); IGEType igeRoot = (IGEType) jaxbUnmarshaller.unmarshal(XMLfile); **List<SEANSytlType> listofAltinYtl = (List<SEANSytlType>) ((List<ALTINType>) igeRoot.getALTIN()).getSEANSytl();** for (SEANSytlType altinYtl : listofAltinYtl) { } } catch (JAXBException e) { e.printStackTrace(); } }
在我的處理程序類中,我嘗試到達最后一個后繼類(列表SEANSytlType),但是它不起作用。 我收到此錯誤:
jvmId:[300],transactionId:[3005624292568000]。根本原因:[java.lang.ClassCastException:java.util.ArrayList無法轉換為com.ykb.hmn.mdt.marketdata.xmlparser.iab.ALTINType]
我也嘗試在處理程序,但相同的:
IGEType igeRoot = (IGEType) jaxbUnmarshaller.unmarshal(XMLfile);
String inputDate = igeRoot.getIGEBULTENGUNTR().getGun2();
List<ALTINType> listAltinRoot = (List<ALTINType>) igeRoot.getALTIN();
List<SEANSytlType> listofAltinYtl = (List<SEANSytlType>) listAltinRoot.get(0);
我哪里錯了? 提前致謝!
基於您的樣本類IGEType
@XmlRootElement(name = "IGE")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "IGE", propOrder = { "altin" })
public class IGEType {
@XmlElement(name = "Altin", required = true)
public List<ALTINType> altin;
public List<ALTINType> getALTIN() {
if (altin == null) {
altin = new ArrayList<ALTINType>();
}
return this.altin;
}
}
然后ALTINType
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "altin", propOrder = { "seanSytl" })
public class ALTINType {
@XmlElement(name = "SEANSytl", required = true)
protected SEANSytlType seanSytl;
}
然后是SEANSytlType
<!-- language: java -->
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SEANSytl", propOrder = { "birim"})
public class SEANSytlType {
@XmlElement(required = true)
protected String birim;
}
然后進行樣品測試
<!-- language: java -->
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
JAXBContext jaxbContext = JAXBContext.newInstance(IGEType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
File XMLfile = new File("sample1.xml");
IGEType igeRoot = (IGEType) jaxbUnmarshaller.unmarshal(XMLfile);
List<ALTINType> listAltinRoot = igeRoot.getALTIN();
// here you ll be have error ///
// List<SEANSytlType> listofAltinYtl = (List<SEANSytlType>) listAltinRoot.get(0);
//
// for (SEANSytlType altinYtl : listofAltinYtl) {
// System.out.println(altinYtl.birim);
// }
} catch (JAXBException e) {
e.printStackTrace();
}
}
因此,並結束示例xml
<?xml version="1.0" encoding="UTF-8"?>
<IGE>
<Altin>
<SEANSytl>
<birim>cccc</birim>
</SEANSytl>
</Altin>
<Altin>
<SEANSytl>
<birim>dddd</birim>
</SEANSytl>
</Altin>
</IGE>
所以基本上的問題是,您在根(IGE)子列表中有altin,但在altin對象中,只有1個子對象seansylt不在列表中,就像您在altin中一樣,因此修復altin對象在此添加列表並看一下我的示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.