gpt4 book ai didi

java - JAXB 可以分块解析大型 XML 文件吗

转载 作者:IT老高 更新时间:2023-10-28 20:38:59 24 4
gpt4 key购买 nike

我需要解析可能很大的 XML 文件,其中的模式已经在多个 XSD 文件中提供给我,因此 XML 绑定(bind)非常受欢迎。我想知道是否可以使用 JAXB 分 block 解析文件,如果可以,如何。

最佳答案

因为代码很重要,这里是 PartialUnmarshaller谁将大文件读入 block 中。可以这样使用new PartialUnmarshaller<YourClass>(stream, YourClass.class)

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.*;
import java.io.InputStream;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static javax.xml.stream.XMLStreamConstants.*;

public class PartialUnmarshaller<T> {
XMLStreamReader reader;
Class<T> clazz;
Unmarshaller unmarshaller;

public PartialUnmarshaller(InputStream stream, Class<T> clazz) throws XMLStreamException, FactoryConfigurationError, JAXBException {
this.clazz = clazz;
this.unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller();
this.reader = XMLInputFactory.newInstance().createXMLStreamReader(stream);

/* ignore headers */
skipElements(START_DOCUMENT, DTD);
/* ignore root element */
reader.nextTag();
/* if there's no tag, ignore root element's end */
skipElements(END_ELEMENT);
}

public T next() throws XMLStreamException, JAXBException {
if (!hasNext())
throw new NoSuchElementException();

T value = unmarshaller.unmarshal(reader, clazz).getValue();

skipElements(CHARACTERS, END_ELEMENT);
return value;
}

public boolean hasNext() throws XMLStreamException {
return reader.hasNext();
}

public void close() throws XMLStreamException {
reader.close();
}

void skipElements(int... elements) throws XMLStreamException {
int eventType = reader.getEventType();

List<Integer> types = asList(elements);
while (types.contains(eventType))
eventType = reader.next();
}
}

关于java - JAXB 可以分块解析大型 XML 文件吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134189/

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