如何解析大型复杂xml

问题描述 投票:5回答:6

我需要解析一个大型的复杂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>
java spring xml-parsing jaxb spring-batch
6个回答
1
投票
从这里,您可以随意使用任何OXM编组器,我也恰好也使用JAXB。

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

收集的元素类非常基础:


0
投票

0
投票


0
投票

0
投票
您可以在读取XML时调用method。这使您可以部分处理XML。您可以反序列化将部分XML数据读取到Java对象。

即使您可以使用它来读入多线程。

您可以在此答案中找到很好的例子

© www.soinside.com 2019 - 2024. All rights reserved.