Hay 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.
2209 visitas.
Muy bien explicado el blog realmente lo necesitaba