[英]Chunking XML with XMLStreamReader failing
我正在尝试使用StAX和JAXB将大型XML分成较小的块。 这是我正在处理的示例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();
我能够正确读取第一条记录。 但是在读取了第一条记录之后,流将移至第二条记录而不是。 因此,我无法处理第二条记录。 我不确定我要去哪里错。 请帮忙。
解决方法如下:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.