100 % local: tus datos nunca salen de tu navegador

XML a CSV — una fila por elemento

Convierte elementos XML repetidos en filas. Los nombres de los hijos forman las columnas, listo para abrir en una hoja o pasar a un script.

Instantáneo Privado Cero cookies
Delimitador
Invertir: CSV → XML

Entrada XML

Salida CSV

Qué hace esta herramienta

Encuentra el elemento repetido y convierte cada aparición en una fila.

<pedidos>
  <pedido id="1"><cliente>Ada</cliente><total>42</total></pedido>
  <pedido id="2"><cliente>Alan</cliente><total>17</total></pedido>
</pedidos>
cliente,total,id
Ada,42,1
Alan,17,2

Las envolturas de clave única se atraviesan solas: <pedidos><pedido>… no necesita configuración. Una envoltura con su propio atributo —<pedidos total="2">— también: ese atributo describe la colección, no una fila, así que no pasa a ser columna. Un atributo puesto en una fila, sí.

Los atributos son columnas

Un identificador alojado en un atributo es un dato como cualquier otro. @_id pasa a ser la columna id.

El prefijo se conserva en un solo caso: cuando un elemento hijo ya lleva ese nombre. <row id="1"><id>x</id></row> da dos columnas, id y @_id, porque son dos cosas distintas y fundirlas haría desaparecer una. Un interruptor descarta los atributos por completo si tu tabla debe venir solo de los elementos.

Una fila es una tabla

Un export de un solo registro se convierte como cualquier otro. Merece decirse porque antes no era así: XML a JSON devuelve un objeto y no un array cuando el elemento no se repite, y exigir el array rechazaba un documento perfectamente corriente.

Un elemento raíz que solo contiene texto sigue rechazándose: un valor no es una tabla, y fingir lo contrario no ayudaría a nadie.

Las filas que no se parecen

La cabecera es la unión de todo lo visto, en orden de aparición. A la fila que le falte una columna se le da una celda vacía:

<r><row><a>1</a></row><row><a>2</a><b>3</b></row></r>
a,b
1,
2,3

Un export irregular es normal. Descartar la columna de más, o la fila que no la tiene, perdería datos por afán de orden.

Lo que una celda no puede contener

Una celda lleva un valor. Cuando un elemento contiene un subárbol, ese subárbol se escribe como JSON dentro de la celda en lugar de repartirse en nombres de columna inventados. Es feo y es honesto: no se pierde nada, y ves exactamente qué había.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Dónde fue mi atributo id? Antes desaparecía.
Ahora es una columna. `<row id="1">` da una columna `id` junto a las que vienen de los elementos hijos: un identificador alojado en un atributo sigue siendo un dato, y perderlo en silencio era un defecto real de esta herramienta, encontrado al escribir esta página. Si un elemento hijo ya se llama `id`, el atributo conserva su prefijo `@_` para que las dos columnas sigan siendo distintas.
¿Por qué un elemento anidado aparece como JSON en la celda?
Porque una celda CSV lleva un valor y tu elemento lleva un subárbol. Aplanarlo en columnas `padre.hijo` inventaría una convención de nombres que tu consumidor no ha aceptado; JSON en la celda es al menos inequívoco y reversible. Aplana antes de convertir si quieres columnas de verdad.
Mis filas no tienen todas los mismos hijos. ¿Qué pasa?
La cabecera es la unión de todos los elementos y atributos vistos, en orden de aparición, y una fila a la que le falte uno recibe una celda vacía. Nada se descarta por ser irregular: un export donde solo algunos registros llevan segundo nombre es normal, no un error.

Convertidores relacionados