2013-11-28 27 views
0

这里我XmlRoot类:JAXB河段嵌套的XmlElement实例

@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; 
    } 
} 

然后继任者(子)类根:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "ALTINType", propOrder = { "seanSytl" }) 
public class ALTINType { 

    @XmlElement(name = "SEANSytl", required = true) 
    protected SEANSytlType seanSytl; 

} 

最后,继任类根的继任者:

@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] .Root原因: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); 

我在哪里错了? 在此先感谢!

回答

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> 

所以basicly问题是,你有根(IGE)的孩子的名单的阿尔通,但在阿尔通对象thest只有1名儿童对象seansylt不喜欢列表你在阿尔丁所以修复阿尔廷对象添加列表在那里,看看我的例子

+0

感谢您的解释和答案 –