Как демаршалить большой 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 шт):
Используя совместно 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. Но он такой изощрённый/извращённый, что не отважусь его приводить (хотя тоже применял:). Может когда-нибудь вспомню ссылку на статью зарубежного автора.