2013-08-29 3 views
4

Я хочу размонтировать данный xml-файл с помощью jaxb2. Вот исходный XML-документ.Unmarshalling complex xml с вложенными дочерними элементами

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <calendarList> 
     <calendar> 
      <calendarCode>Default</calendarCode> 
      <weeklyDefault>1111111</weeklyDefault> 
      <exceptionList> 
       <exception> 
        <exceptionDate>2012-03-01T00:00:00</exceptionDate> 
        <isOpen>false</isOpen> 
       </exception> 
       <exception> 
        <exceptionDate>2012-03-02T00:00:00</exceptionDate> 
        <isOpen>false</isOpen> 
       </exception> 
      </exceptionList> 
      </calendar> 
     <calendar/> 
    <calendarList> 
</root> 

для этого я определил следующие XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      jxb:version="2.0"> 

    <xsd:element name="root" type="Root" /> 

    <xsd:complexType name="Root"> 
     <xsd:sequence> 
      <xsd:element name="calendarList" type="CalendarList" minOccurs="0" maxOccurs="1"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="CalendarList"> 
     <xsd:sequence> 
      <xsd:element name="calendar" type="Calendar" minOccurs="0" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="Calendar"> 
     <xsd:sequence> 
      <xsd:element name="calendarCode" type="xsd:string" /> 
      <xsd:element name="weeklyDefault" type="xsd:string" /> 
      <xsd:element name="exceptionList" type="ExceptionList" minOccurs="0" maxOccurs="1" /> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="ExceptionList"> 
     <xsd:sequence> 
      <xsd:element name="exceptionCalendar" type="ExceptionCalendar" maxOccurs="unbounded" /> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="ExceptionCalendar"> 
     <xsd:sequence> 
      <xsd:element name="exceptionDate" type="xsd:dateTime" /> 
      <xsd:element name="isOpen" type="xsd:boolean"/> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

Использование JAXB я создал классы для этого, но когда я демаршаллизацию я только смог получить Календарь объекты, но не вложенную «Exception» объекты внутри Исключительный список Calendar. После код будет разъяснено выше

public void CheckResults(filePath){ 
    Root ods = handler.unmarshal(filePath); 
    for(Calendar calendar : ods.getCalendarList().getCalendar()) 
    { 
     System.out.println(calendar.getCalendaeCode()); //Here I have the element calendar 
     //but calendar.getExceptionList().getExceptionCalendar() has no member 
     for (ExceptionCalendar expCal : calendar.getExceptionList().getExceptionCalendar()) 
     { 
      System.out.println(expCal.getExceptionDate()); 
     } 
    } 
} 

Вот логика метода handler.unmarshal

public Root unmarshal(String filePath) { 
     try{ 
      JAXBContext jc = JAXBContext.newInstance(DOMAIN_PKG); 
      Unmarshaller unmarsaller = jc.createUnmarshaller(); 

      JAXBElement<Root> oDS; 
      if(filePath.isEmpty()) { 
       oDS = (JAXBElement<Root>) unmarsaller.unmarshal(System.in); 
      } else { 
       File file = new File(filePath); 
       oDS = (JAXBElement<Root>) unmarsaller.unmarshal(file); 
      } 
      return oDS.getValue(); 
     }catch(JAXBException exp){ 
      exp.printStackTrace(); 
     } 

     return null; 
    } 

Было бы большую помощь, если кто-то может объяснить, как создание объекта происходит в то время как демаршаллизации. Наверное, мне не хватает чего-то маленького, но важного здесь.

ответ

1

Я думаю, что ваша схема неправильная, замените name="ExceptionCalendar" на name="exception" и восстановите объекты JAXB.

<xsd:complexType name="ExceptionList"> 
    <xsd:sequence> 
     <xsd:element name="exception" type="ExceptionCalendar" maxOccurs="unbounded" /> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="ExceptionCalendar"> 
    <xsd:sequence> 
     <xsd:element name="exceptionDate" type="xsd:dateTime" /> 
     <xsd:element name="isOpen" type="xsd:boolean"/> 
    </xsd:sequence> 
</xsd:complexType> 
+0

Большое спасибо Benoit. Я пропустил это :) – Hishekha

Смежные вопросы