Конвертировать XML файл в CSV в Java
@ Перед тем, как, возможно, будут предложены несколько дублирующих вопросов, я не думаю, что в этом случае, возможно, сначала прочитайте это, я постараюсь быть максимально кратким. Название дает основную идею.
Вот пример XML (случай 1):
<root>
<Item>
<ItemID>4504216603</ItemID>
<ListingDetails>
<StartTime>10:00:10.000Z</StartTime>
<EndTime>10:00:30.000Z</EndTime>
<ViewItemURL>http://url</ViewItemURL>
....
</item>
Вот пример XML (случай 2):
<Item>
<ItemID>4504216604</ItemID>
<ListingDetails>
<StartTime>10:30:10.000Z</StartTime>
<!-- Start difference from case 1 -->
<averages>
<AverageTime>value1</AverageTime>
<category type="TX">9823</category>
<category type="TY">9112</category>
<AveragePrice>value2</AveragePrice>
</averages>
<!-- End difference from case 1 -->
<EndTime>11:00:10.000Z</EndTime>
<ViewItemURL>http://url</ViewItemURL>
....
</item>
</root>
Я заимствовал этот XML из Google, в любом случае мои объекты не всегда одинаковы, иногда есть дополнительные элементы, как в случае case2. Теперь я хотел бы создать CSV, как это из обоих случаев:
ItemID,StartTime,EndTime,ViewItemURL,AverageTime,AveragePrice
4504216603,10:00:10.000Z,10:00:30.000Z,http://url
4504216604,10:30:10.000Z,11:00:10.000Z,http://url,value1,value2
Эта 1-я строка является заголовком, она также должна быть включена в CSV. У меня есть несколько полезных ссылок на Stax сегодня, я действительно не знаю, какой правильный / оптимальный подход для этого, я борюсь с этим в течение 3 дней, пока не собираюсь сдаваться.
Скажи мне, что ты думаешь, как бы ты решил это
Я забыл упомянуть, что это очень большой XML-файл до 1 ГБ
ОБНОВЛЕНИЕ BOUNTY:
Я ищу более общий подход, означающий, что это должно работать для любого количества узлов с любой глубиной, и иногда, как в примере xml, может случиться так, что одинitem
Объект имеет большее количество узлов, чем следующий / предыдущий, поэтому для этого должен быть случай (поэтому все столбцы и значения совпадают в CSV).
Также может случиться, что узлы имеют одинаковое имя / localName, но разные значения и атрибуты, если это так, тогда в CSV должен появиться новый столбец с соответствующим значением. (Я добавил пример этого случая внутри<averages>
тег называетсяcategory
)