gpt4 book ai didi

java - 如何解析大型复杂的xml

转载 作者:搜寻专家 更新时间:2023-11-01 00:51:29 26 4
gpt4 key购买 nike

我需要解析一个大型复杂的 xml 并写入一个平面文件,你能给我一些建议吗?

文件大小: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>

最佳答案

在 Spring Batch 中,我编写了自己的 stax 事件项读取器实现,它比前面提到的更具体一些。基本上,我只是将元素填充到 map 中,然后将它们传递到 ItemProcessor 中。从那里,您可以自由地将它转换为来自“GatheredElement”的单个对象(请参阅 CompositeItemProcessor)。很抱歉从 StaxEventItemReader 复制/粘贴了一点,但我认为这是不可避免的。

从这里开始,您可以自由使用任何您喜欢的 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;
}

聚集的元素类非常基础:

public class GatheredElementItem<T> {
private final T item;
private final Map<String, String> gatheredElements;
...
}

关于java - 如何解析大型复杂的xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com