我需要解析一个大型的复杂xml并写入一个Flat文件,您能提供一些建议吗?
文件大小:500MB记录数:100KXML结构:
<Msg>
<MsgHeader>
<!--Some of the fields in the MsgHeader need to be map to a java object-->
</MsgHeader>
<GroupA>
<GroupAHeader/>
<!--Some of the fields in the GroupAHeader need to be map to a java object-->
<GroupAMsg/>
<!--50K records-->
<GroupAMsg/>
<GroupAMsg/>
<GroupAMsg/>
</GroupA>
<GroupB>
<GroupBHeader/>
<GroupBMsg/>
<!--50K records-->
<GroupBMsg/>
<GroupBMsg/>
<GroupBMsg/>
</GroupB>
</Msg>
public class ElementGatheringStaxEventItemReader<T> extends StaxEventItemReader<T> {
private Map<String, String> gatheredElements;
private Set<String> elementsToGather;
...
@Override
protected boolean moveCursorToNextFragment(XMLEventReader reader) throws NonTransientResourceException {
try {
while (true) {
while (reader.peek() != null && !reader.peek().isStartElement()) {
reader.nextEvent();
}
if (reader.peek() == null) {
return false;
}
QName startElementName = ((StartElement) reader.peek()).getName();
if(elementsToGather.contains(startElementName.getLocalPart())) {
reader.nextEvent(); // move past the actual start element
XMLEvent dataEvent = reader.nextEvent();
gatheredElements.put(startElementName.getLocalPart(), dataEvent.asCharacters().getData());
continue;
}
if (startElementName.getLocalPart().equals(fragmentRootElementName)) {
if (fragmentRootElementNameSpace == null || startElementName.getNamespaceURI().equals(fragmentRootElementNameSpace)) {
return true;
}
}
reader.nextEvent();
}
} catch (XMLStreamException e) {
throw new NonTransientResourceException("Error while reading from event reader", e);
}
}
@SuppressWarnings("unchecked")
@Override
protected T doRead() throws Exception {
T item = super.doRead();
if(null == item)
return null;
T result = (T) new GatheredElementItem<T>(item, new HashedMap(gatheredElements));
if(log.isDebugEnabled())
log.debug("Read GatheredElementItem: " + result);
return result;
}
收集的元素类非常基础:
即使您可以使用它来读入多线程。
您可以在此答案中找到很好的例子