Как демаршалить большой XML файл в базу данных MySQL?

Как я могу демаршалить( unmarshaling) большой XML файл в базу данных MySQL?

Не могу найти толковую стать где сложный большой файл XML можно в нее положить.

Примерная структура файла, который нужно положить в БД

**

<?xml version="1.0" ?>
<SALES>
   <SALE>
    <CARD>11111</CARD_NUMBER>
    <DATE>11111111</DATE>
    <PRODUCTS>
        <PRODUCT>
            <PRODUCT_CODE>111</PRODUCT_CODE>
            <NAME>11111</NAME>
            <PRICE>11111</PRICE>
            <COUNT>11111</COUNT>
        </PRODUCT>
    </PRODUCTS>
</SALE>
</SALES>
**

Ответы (1 шт):

Автор решения: Sergey

Используя совместно StAX и JAXB, часто удаётся удобно обрабатывать большие XML в поточном режиме.
Оказывается JAXB может загружать из XMLStreamReader только часть документа!
Нужно только предварительно подвести XMLStreamReader к нужному элементу и передать управление unmarshaller-у JAXB.
После загрузки (unmarshal) очередного элемента, нужно подвинуть XMLStreamReader к следующему.
Таким нехитрым образом можно обработать весь xml, не загружая его в память единовременно.

JAXBContext jaxbContext;
Unmarshaller unmarshaller;
XMLStreamReader streamReader;

XMLInputFactory inputFactory = XMLInputFactory.newFactory();
streamReader = inputFactory.createXMLStreamReader(inputStream);
jaxbContext = JAXBContext.newInstance(Sale.class);
unmarshaller = jaxbContext.createUnmarshaller();
while (streamReader.hasNext()) {
    int event = streamReader.getEventType();
    // Проверяем, что встали на элемент <SALE>
    if (event == XMLEvent.START_ELEMENT && "SALE".equals(streamReader.getLocalName())) {
        // Загрузить <SALE> с помощью JAXB
        JAXBElement<Sale> saleElement = unmarshaller.unmarshal(streamReader, Sale.class);
        Sale sale = saleElement.getValue();
        saveToDb(sale);
    }
}
streamReader.close();

Список продуктов PRODUCTS внутри SALE будет загружен полностью, конечно.
Если он не большой, то ничего страшного.
А если же огромный, и его тоже хочется обработать в поточном режиме, то тут я пасс. Никогда не думал о том, можно ли для вложенных списков как-то комбинировать StAX и JAXB.
Есть правда один способ использовать только JAXB. Но он такой изощрённый/извращённый, что не отважусь его приводить (хотя тоже применял:). Может когда-нибудь вспомню ссылку на статью зарубежного автора.

→ Ссылка