Converta arquivo XML para CSV em java

@ Antes de haver provavelmente algumas sugestões de perguntas duplicadas, acho que não é o caso, talvez leia isso primeiro, tentarei ser o mais breve possível. Título dá uma idéia básica.

Aqui está um exemplo de XML (caso 1):

<root>
      <Item>
        <ItemID>4504216603</ItemID>
        <ListingDetails>
          <StartTime>10:00:10.000Z</StartTime>
          <EndTime>10:00:30.000Z</EndTime>
          <ViewItemURL>http://url</ViewItemURL>
            ....
           </item>      

Aqui está um exemplo de XML (caso 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>

Peguei emprestado esse XML do google, de qualquer maneira meus objetos nem sempre são os mesmos, às vezes há elementos extras como no case2. Agora eu gostaria de produzir CSV assim nos dois casos:

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

Essa primeira linha é o cabeçalho e também deve ser incluída no csv. Eu tenho alguns links úteis para o stax hoje, eu realmente não sei qual é a abordagem certa / ideal para isso, estou lutando com isso há 3 dias, não querendo desistir ainda.

Diga-me o que você pensa, como você resolveria isso

Eu esqueci de mencionar que este é um arquivo xml muito grande de até 1gb

ATUALIZAÇÃO GRATUITA:

Estou procurando uma abordagem mais genérica, o que significa que isso deve funcionar para qualquer número de nós com profundidade e, às vezes, como no exemplo xml, pode acontecer que umitem O objeto tem um número maior de nós que o próximo / anterior, portanto, também deve haver caso para isso (para que todas as colunas e valores correspondam no CSV).

Também pode acontecer que os nós tenham o mesmo nome / localName, mas valores e atributos diferentes, se esse for o caso, uma nova coluna deverá aparecer no CSV com o valor apropriado. (Adicionei exemplo deste caso dentro<averages> tag chamadacategory)

questionAnswers(8)

yourAnswerToTheQuestion