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