Как преобразовать большой XML-файл в stream-like-java8 объекта

2

Hy, у меня есть (очень) большой XML файл (100 ГБ) со списком foo, я хочу преобразовать его в поток, похожий на тот, который вводит в java 8 объекта:

Любая идея примера lib или кода?

в начале:

<foos> 
  <foo>...</foo>
  <foo>...</foo>
</foos>

в конце:

Stream<Foo>  foosStream = ????("foo.xml")
streamFoos.forEach(foo->foo.doFooStuffs());

Редактировать: @Pierre Спасибо, вот реализация вашего решения:

  try {
            XMLEventReader reader = XMLInputFactory.newInstance().
                    createXMLEventReader(stream);
            final Unmarshaller unmarshaller = JAXBContext.newInstance(XXXXX.class).createUnmarshaller();

            Iterator<XXXXX> it = new XmlIterator<>(reader, unmarshaller, "xxxxxx");
            return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false);
        } catch (XMLStreamException e1) {
            logger.error("XMLStreamException", e1);
        } catch (JAXBException e) {
            logger.error("JAXBException", e);
        }

а также

public class XmlIterator<T> implements Iterator<T> {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    XMLEventReader reader;

    XMLEvent event;

    Unmarshaller unmarshaller;
    String name;

    public XmlIterator(XMLEventReader reader, Unmarshaller unmarshaller, String name) {
        this.reader = reader;
        this.unmarshaller = unmarshaller;
        this.name = name;
        try {
            reader.next();
            this.event = reader.peek();
        } catch (XMLStreamException e) {
            logger.error("", e);
            event = null;
        }
    }

    @Override
    public boolean hasNext() {
        try {
            while (event != null && !(event.isStartElement() && name.equals(event.asStartElement().getName().getLocalPart()))) {
                Object a = reader.next();
                event = reader.peek();
            }
            return event != null;

        } catch (XMLStreamException e) {
            logger.error("", e);
            event = null;
        }
        return event != null;
    }

    @Override
    public T next() {
        try {
            T next = ((JAXBElement<T>) unmarshaller.unmarshal(reader)).getValue();
            event = reader.peek();
            return next;
        } catch (JAXBException e) {
            logger.error("error during unmarshalling ", e);
            return null;
        } catch (XMLStreamException e) {
            logger.error("error during stream ", e);
            return null;
        }
    }
}
  • 1
    Знаете ли вы различные методы и API для чтения XML-файла в Java? Какой из них, как вы думаете, подходит здесь? Насколько большими будут XML-файлы? Возможно, вы хотите взглянуть на StAX, но не могли бы вы добавить больше контекста в свой вопрос?
  • 1
    Да, я много знаю, но все они очень низкого уровня. Я не понимаю, почему в 2016 году мне все еще приходится анализировать start_element вручную, чтобы генерировать поток, когда я мог бы просто указать Xpath.
Показать ещё 1 комментарий
Теги:
java-8
stream

1 ответ

5
Лучший ответ
  • 0
    Вероятно, проще просто не использовать поток и вызывать потребительский метод самостоятельно для каждого вызова Foo ...
  • 0
    все либ, чем я нахожу, датированы потоком, нет ли более свежей либ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню