Convierte archivos XML a CSV en Java

@Antes de que probablemente haya algunas sugerencias de preguntas duplicadas, no creo que sea el caso, tal vez lea esto primero, intentaré ser lo más breve posible. El título da una idea básica.

Aquí hay un ejemplo 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>      

Aquí hay un ejemplo 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>

Tomé prestado este XML de google, de todos modos mis objetos no siempre son los mismos, a veces hay elementos adicionales como en case2. Ahora me gustaría producir CSV como este a partir de ambos 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

Esta primera línea es encabezado, también debe incluirse en csv. Hoy tengo algunos enlaces útiles para Stax, realmente no sé cuál es el enfoque correcto / óptimo para esto, estoy luchando con esto durante 3 días, todavía no estoy dispuesto a rendirme.

Dime qué piensas, ¿cómo resolverías esto?

Olvidé mencionar que este es un archivo xml muy grande de hasta 1 gb

ACTUALIZACIÓN DE REGALO:

Estoy buscando un enfoque más genérico, lo que significa que esto debería funcionar para cualquier número de nodos con cualquier profundidad, y a veces, como en el ejemplo xml, puede suceder queitem El objeto tiene un mayor número de nodos que el siguiente / anterior, por lo que también debe haber un caso para eso (para que todas las columnas y valores coincidan en CSV).

También puede suceder que los nodos tengan el mismo nombre / nombre local pero diferentes valores y atributos, si ese es el caso, entonces debería aparecer una nueva columna en CSV con el valor apropiado. (Agregué un ejemplo de este caso dentro<averages> etiqueta llamadacategory)

Respuestas a la pregunta(8)

Su respuesta a la pregunta