Convertir XML a CSV con C#

Convertir XML a CSVHay diversas formas de convertir xml a csv pero aquí vamos a tratar una como mero ejercicio para aprender a reocorrer un XML recuperando sus valores de una forma rápida.

Pongamos que tenemos un xml que nos indicase el numero de nodos hijos, como este:

<personas>
    <total>3</total>
    <persona1>
        <nombre>Fulano</nombre>
        <edad>20</edad>
    </persona1>
    <persona2>
        <nombre>Mengano</nombre>
        <edad>30</edad>
    </persona2>
    <persona3>
        <nombre>Perengano</nombre>
        <edad>40</edad>
    </persona3>
</personas>

Para todos los ejemplos de este post, usaremos la sigueinte librería:

using System.Xml.Linq;

Recorrerlo y pasarlo a formato CSV, es decir, un fichero de texto separado por comas o puntos y coma, sería sencillisimo con esta función:

        public static string ConvertToCsv(string XmlMsg)
        {
            string sep = ";";
            string csv = "Nombre;Edad" + Environment.NewLine;

            XElement xEle = XElement.Parse(XmlMsg);
            var items = Convert.ToInt32(xEle.Element("total").Value);
            
            for (int i = 1; i <= items; i++)
            {
                XElement xPersona = xEle.Element("persona" + i);
                csv += (string)xPersona.Element("nombre") + sep;
                csv += (string)xPersona.Element("edad") + Environment.NewLine;
            }
            
            return csv;
        }

Recorrer y convertir xml a csv con nodos fijos.

Normalmente los ficheros xml no vienen con un nodo que indique el número total de nodos hijos, de formar que hay que adaptarse a las características del XML a convertir.

De forma que si tuvieramos este XML:

<personas>
    <persona>
        <nombre>Fulano</nombre>
        <edad>20</edad>
    </persona>
    <persona>
        <nombre>Mengano</nombre>
        <edad>30</edad>
    </persona>
    <persona>
        <nombre>Perengano</nombre>
        <edad>40</edad>
    </persona>
</personas>

Habría que adaptar la función para recorrer todos los elementos de tipo «persona» que tuviera el xml, e ir obteniendo sus valores:

        public static string ConvertToCsv(string XmlMsg)
        {
            string sep = ";";
            string csv = "Nombre;Edad" + Environment.NewLine;

            XElement xEle = XElement.Parse(XmlMsg);
                        
            foreach(XElement e in xEle.Descendants("persona"))
            {
                csv += (string)e.Element("nombre") + sep;
                csv += (string)e.Element("edad") + Environment.NewLine;
            }
            
            return csv;
        }

Recorrer y convertir xml a csv con muchos nodos hijos.

El ejemplo anterior es muy válido cuando los nodos a recuperar son pocos, pero si por cada nodo «persona» tuvieramos muchísimos nodos hijos, sería mas óptimo y claro a nivel de código el recorrerlos a su vez y recuperar su valor para ir concatenándolo a la variable final con el contenido en formato CSV.

        public static string ConvertToCsv(string XmlMsg)
        {
            string sep = ";";
            string csv = "Nombre;Edad" + Environment.NewLine;

            XElement xEle = XElement.Parse(XmlMsg);
                        
            foreach(XElement e in xEle.Descendants("persona"))
            {
                foreach (XElement el in e.Descendants())
                {
                    csv += (string)el.Value + sep;
                }
                csv += Environment.NewLine;
            }
            
            return csv;
        }

Sin duda, puede haber tantos métodos de convertir xml a csv como la algoritmia y nuestra imaginación nos permita, ya es cosa nuestra el buscar el más óptimo.

 

2187 visitas.

Un comentario sobre “Convertir XML a CSV con C#

Responder a Jose Antonio Sarria Garcia Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *