martes, 17 de mayo de 2016

Extraer Datos de un XML

En esta entrada veremos como podemos extraer datos de un archivo XML, cosa que es muy sencilla en realidad.

Para eso necesitaremos los siguientes elementos:

"FileUpload"
"Button"
"GridView"
"Panel"
"Label"

El "FileUpload" nos servirá para leer los archivos XML, el "Button" ejecutara el proceso para leer los datos, en el "Gridview" vamos a mostrar los datos que recuperaremos de nuestro archivo y en el "Panel" meteremos el "Label" para mostrar algún tipo de error que nos mande el proceso.

Nuestra pantalla quedará así:

 
 

Dentro del código, en el Page_Load vamos a poner nuestro "Panel" como invisible, para que solo aparezca cuando mandemos un mensaje, en mi caso sea así  "Panel4.Visible = false;".

En el diseño le damos doble click al "Button" para que nos genere el evento "Click", vamos a generar 2 eventos, uno para borrar los archivos que estén en el directorio donde almacenaremos los XML(para esto vamos a crear una carpeta en nuestro proyecto que se llamará: ArchivosXML),  que vamos a leer y otro para hacer la lectura.

El evento para borrarlos será el siguiente:

      private void borrarArchivos()
    {
        try
        {
            Panel3.Visible = false;
            Panel3.Visible = false;
            string sourceDir = (Server.MapPath("~/ArchivosXML/"));

            string[] txtList = Directory.GetFiles(sourceDir, "*.xml");
            foreach (string f in txtList)
            {
                File.Delete(f);
            }
        }
        catch (Exception ex)
        {
            Panel4.Visible = true;
            Label1.Text = ex.Message.ToString();
        }
    }


Y el evento para hacer la lectura nos quedará de la siguiente forma:

     private void cargaArchivos()
    {
        if (FileUpload1.HasFile)
        {
            DateTime fechaVar = DateTime.Now;
            string foliovar = " ";
            string serievar = "";
            Decimal totalvar = 0;

            DataTable dt = new DataTable();
            dt.Columns.Add("fFecha");
            dt.Columns.Add("cFolio");
            dt.Columns.Add("cSerie");
            dt.Columns.Add("mTotal");
            DataRow dr;
            DataSet ds = new DataSet();

            ds.Tables.Add(dt);
            FileUpload1.SaveAs(Server.MapPath("~/ArchivosXML/") + FileUpload1.FileName);
            XmlTextReader reader = new XmlTextReader((Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString());
            XDocument docContactos = XDocument.Load((Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString());
            string Archivo = (Server.MapPath("~/ArchivosXML/")) + FileUpload1.FileName.ToString();

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        try
                        {
                            XmlDocument DocumentXml = new XmlDocument();
                            DocumentXml.Load(Archivo);
                            XmlNodeList Documento = DocumentXml.GetElementsByTagName(reader.Name);

                            int i = 0;
                            foreach (XmlElement nodoDocumento in Documento)
                            {
                                if (reader.Name.Contains("Comprobante"))
                                {
                                    if (Documento[i].Attributes["fecha"] != null)
                                    {
                                        fechaVar = Convert.ToDateTime(Documento[i].Attributes["fecha"].Value.Substring(0, 10));


                                        if (Documento[i].Attributes["total"] != null)
                                        {
                                            totalvar = Convert.ToDecimal(Documento[i].Attributes["total"].Value);
                                        }
                                    }
                                }
                                if (reader.Name.Contains("Comprobante"))
                                {
                                    if (Documento[i].Attributes["folio"] != null)
                                    {
                                        foliovar = Documento[i].Attributes["folio"].Value;
                                    }
                                    if (Documento[i].Attributes["serie"] != null)
                                    {
                                        serievar = Documento[i].Attributes["serie"].Value;
                                    }
                                    i++;
                                }

                            }
                        }
                        catch (Exception ex)
                        {
                            Panel4.Visible = true;
                            Label1.Text = ex.Message.ToString();
                        }
                        break;
                }
            }
            dr = dt.NewRow();
            dr["cFolio"] = foliovar;
            dr["cSerie"] = serievar;
            dr["mTotal"] = totalvar.ToString();
            dr["fFecha"] = fechaVar.ToShortDateString();
            dt.Rows.Add(dr);
            GridView1.DataSource = ds;
            GridView1.DataBind();
            reader.Close();
            //validaEmpresa();
            if (System.IO.File.Exists(Archivo))
            {
                try
                {
                    System.IO.File.Delete(Archivo);
                }
                catch (System.IO.IOException e)
                {
                    Panel4.Visible = true;
                    Label1.Text = e.Message.ToString();
                }

            }
        }
        else
        {
            Panel4.Visible = true;
            Label1.Text = "Seleccione un archivo XML para llevar a cabo el proceso";
        }
    }


El evento que se genero al darle doble click a nuestro "Button", quedará así:
 
     protected void Button1_Click(object sender, EventArgs e)
    {
        borrarArchivos();
        cargaArchivos();
    }


Ahora si vamos a ejecutar nuestra aplicación web para ver como se ve y, lo mas importante, ver que funcione realmente.

Así se ve:

 
 
Le damos un click en Examinar para que nos abra le cuadro para seleccionar los archivos:


 
 
Ya tenemos seleccionado nuestro XML:
 
 
 
Y ahora le daremos click al botón de cargar y veremos el resultado:
 
 
En el "GridView" se muestran los datos que leímos del XML.
 
Les dejo el link del ejemplo para que puedan descargarlo.
 
 
Como siempre,  espero y les sirva de algo mi experiencia, les dejo a su disposición mi correo para cualquier duda, aclaración o sugerencia, ricegamo@hotmail.com
Saludos