2015-06-16 37 views
0

我想用StAX和JAXB將大塊XML分成較小的塊。這裏是我正在處理的示例XML:用XMLStreamReader失敗分塊XML

<asset> 
    <entity> 
     <record> 
      <field> 
       <id>remarks</id> 
       <value>ready to test1</value> 
      </field> 
     </record> 
     <record> 
      <field> 
       <id>input_quarter</id> 
       <value>Jun-Sep</value> 
      </field> 
     </record> 
    </entity> 
</asset> 

我想一次讀取記錄並處理它。下面是我如何做到這一點:

ClassPathResource classPathResource = new ClassPathResource("samples/form2/data/test.xml"); 
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); 
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(classPathResource.getInputStream()); 

JAXBContext jaxbContext = JAXBContext.newInstance(EntityRecordData.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
while(xmlStreamReader.hasNext()){ 
    int eventType = xmlStreamReader.next(); 
    switch (eventType) { 
    case XMLEvent.START_ELEMENT: 
     System.out.println("Element: "+xmlStreamReader.getLocalName()); 
     if("record".equals(xmlStreamReader.getLocalName())){ 
      Object unmarshal = unmarshaller.unmarshal(xmlStreamReader); 
     } 
     break; 
    case XMLEvent.CHARACTERS: 
     String text = xmlStreamReader.getText(); 
     System.out.println("Text: "+text); 
     break; 
    case XMLEvent.END_ELEMENT: 
     break; 
    default : break; 
    } 
} 
xmlStreamReader.close(); 

我能夠正確讀取第一條記錄。但是在讀完第一條記錄後,該流將移到第二條記錄中而不是。因此我無法處理第二條記錄。我不知道我哪裏出錯了。請幫忙。

回答

0

這裏是解決方案:

ClassPathResource classPathResource = new ClassPathResource("samples/form2/data/test.xml"); 
    XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
    xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); 
    XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(classPathResource.getInputStream()); 

    JAXBContext jaxbContext = JAXBContext.newInstance(EntityRecordData.class); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
    int eventType = xmlStreamReader.next(); 
    while(true){ 
     switch (eventType) { 
     case XMLEvent.START_ELEMENT: 
      System.out.println("Element: "+xmlStreamReader.getLocalName()); 
      if("record".equals(xmlStreamReader.getLocalName())){ 
       JAXBElement<EntityRecordData> unmarshal = unmarshaller.unmarshal(xmlStreamReader, EntityRecordData.class); 
       final List<IFieldData> fields = unmarshal.getValue().getFields(); 
       System.out.println("**"+fields.get(0).getId()); 
      } else { 
       eventType = xmlStreamReader.next(); 
      } 
      break; 
     case XMLEvent.CHARACTERS: 
      String text = xmlStreamReader.getText(); 
      System.out.println("Text: "+text); 
      eventType = xmlStreamReader.next(); 
      break; 
     case XMLEvent.END_ELEMENT: 
      //System.out.println("End: "+xmlStreamReader.getLocalName()); 
      eventType = xmlStreamReader.next(); 
      break; 
     default : 
      break; 
     } 

     if(!xmlStreamReader.hasNext()){ 
      break; 
     } 
    } 
    xmlStreamReader.close();