Skip to main content

Criar XML a partir de uma classe modelo utilizando Serialize e Deserialize

Neste post vou mostrar como montar um XML a partir de uma classe modelo utilizando o Serilize do c#.
Dica: pode ser utilizado em uma aplicação que tenha um formulário e por algum motivo desconhecido o usuário não esta conseguindo salvar os dados, logo no tratamento da exceção  da aplicação pode-se armazenar os dados do formulário em um arquivo xml utilizando o Serialize e enviar por e-mail para equipe de desenvolvimento, que por sua vez com os dados do usuário fica mais fácil simular o erro e corrigi-lo mais rapidamente.
Crie um novo projeto no Visual Studio do tipo ASP.NET Web Application (C#), monte uma pagina de acordo com os elementos da imagem abaixo

No evento do botão que ira salvar os dados do formulário vou capturar os dados do informados pelo usuário e armazena-los utilizando minha classe modelo com as seguintes propriedades.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace XML_Serialize
{
    public class USUARIO
    {
        public string NOME{get;set;}
        public int SEXO{get;set;}
        public DateTime DATA_NASCIMENTO{get;set;}
        public string TELEFONE{get;set;}
    }
}
Vou criar também uma classe com os métodos que executaram a serialização e deserialização.
Ao executar a deserialização é necessário fechar o arquivo, pois se o usuário abrir o mesmo arquivo de novo não será possível pois o mesmo já esta aberto.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Xml;

namespace XML_Serialize
{
    public class Ferramenta_serialize
    {
        internal string SerializeObject(USUARIO user,string caminhoServidor)
        {
            StringBuilder xm = new StringBuilder();

            MemoryStream memoryStream = new MemoryStream();
            XmlSerializer xs = new XmlSerializer(user.GetType());
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

            xs.Serialize(xmlTextWriter, user);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            xm.Append(UTF8ByteArrayToString(memoryStream.ToArray()));

            //cria o arquivo mesmo que não exista
            string file_ =  user.NOME + ".xml";
            StreamWriter valor = new StreamWriter(caminhoServidor + "\\" + file_);
            valor.Write(xm.ToString().Trim());
            valor.Close();
            return file_;
        }

        internal USUARIO DeserializeObject(System.Web.UI.WebControls.FileUpload fu_XML)
        {
            XmlSerializer xs = new XmlSerializer(typeof(USUARIO));
            FileStream fs = new FileStream(fu_XML.PostedFile.FileName, FileMode.Open);
            XmlReader reader = new XmlTextReader(fs);

            USUARIO user = xs.Deserialize(reader)as USUARIO;
            reader.Close();

            return user;
        }
        /// <summary>
        /// converte um Array de Byte Unicode (UTF-8 encoded) para uma String.
        /// </summary>
        /// <param name="characters">Unicode Array de Byte's para comverter em String</param>
        /// <returns>String formada por Array de Byte's</returns>
        private String UTF8ByteArrayToString(Byte[] characters)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            String constructedString = encoding.GetString(characters);
            return (constructedString);
        }
        /// <summary>
        /// Converte uma String em Array de Byte's UTF-8
        /// </summary>
        /// <param name="XMLString"></param>
        /// <returns></returns>
        private Byte[] StringToUTF8ByteArray(String XMLString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            Byte[] byteArray = encoding.GetBytes(XMLString);
            return byteArray;
        }
    }
}

Agora no evento do botão salvar vou capturar os dados do formulário e utilizar o metodo SerializeObject passando para o mesmo o objeto do tipo USUARIO, preenchido com os dados do formulário.
O mentodo SerializeObject ira retornar o nome do arquivo xml que foi criado e disponibiliza-lo para download utilizando o comando Response.TransmitFile() e Response.End() para abrir o arquivo correto.
No evento do botão que captura o arquivo do componente FileUpload vou chamar o metodo DeserilizeObject que ira receber o componente FileUpload, abrir o arquivo xml, deserilizar e salvar os dados no objeto do tipo USUARIO.
Vou criar também um método para limpar os dados do formulário, por estética apenas, deixando o code-behind assim.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;

namespace XML_Serialize
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            btnSalvar.Click += new EventHandler(btnSalvar_Click);
            btnCarregaArquivo.Click += new EventHandler(btnCarregaArquivo_Click);
        }
        void btnCarregaArquivo_Click(object sender, EventArgs e)
        {
            try
            {
                USUARIO user = new Ferramenta_serialize().DeserializeObject(fu_XML);
                txbNome.Text = user.NOME;
                rblSexo.SelectedValue = user.SEXO.ToString();
                txbDataNascimento.Text = user.DATA_NASCIMENTO.ToShortDateString();
                txbTelefone.Text = user.TELEFONE;

                fu_XML.Dispose();
            }
            catch(Exception ex) {
                lblMensage.Text = ex.Message;
            }
        }
        void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                USUARIO user = new USUARIO()
                {
                    NOME = txbNome.Text.Trim(),
                    SEXO = int.Parse(rblSexo.SelectedValue),
                    DATA_NASCIMENTO = DateTime.Parse(txbDataNascimento.Text.Trim()),
                    TELEFONE = txbTelefone.Text.Trim()
                };
                string rs = new Ferramenta_serialize().SerializeObject(user, Server.MapPath(string.Empty));
                Response.ContentType = "file/xml";
                Response.AppendHeader("Content-Disposition", "attachment; filename="+rs);
                Response.TransmitFile(rs);
                Response.End();
                limpaFormulario();

            }
            catch (Exception ex)
            {
                lblMensage.Text = ex.Message;
            }
        }
        private void limpaFormulario()
        {
            txbNome.Text = string.Empty;
            rblSexo.SelectedValue = null;
            txbDataNascimento.Text = string.Empty;
            txbTelefone.Text = string.Empty;
        }
    }
}
O retorno do nosso XML será algo do tipo;

Comments

Popular posts from this blog

Verificar sequencia de caracteres iguais em uma string c#

Neste post vamos ver como explorar uma string e verificar se existe uma seqüencia de caracteres iguais dentro da string. Utilizaremos a tabela ASCII para verificar letras e números, se você precisar verificar mais caracteres basta consultar a tabela e colocar o número referente na condição. Neste exemplo vou verificar se existe na string uma seqüencia quatro(4) números iguais e o mesmo para uma seqüencia de três(3) letras, pois acho que em números de documentos ou nomes isto não pode acontecer. Tabela de decimal ASCII public static bool ValidaTexto(this string txt) { bool flag = true; if (txt.Length < 3) { flag = false; } else { int contLetras = 0; int contNumeros = 0; int tmp = (int)txt.ToCharArray()[0]; foreach (char c in txt.ToCharArray()) { if (((int)c < 127 && (int)c >= 65)) { if (tmp == (int)c) { contLetras++; } if (contLetras >= 3) { break; } tmp = (int)c; } } //inicia novamente o armazenador tmp =...

CRIANDO APLICATIVOS DO ZERO E FÁCIL!

O QUE VOCÊ VAI APRENDER? SÃO MAIS DE 10 HORAS DE CONTEÚDO PURO E MATERIAIS EXTRAS: CRIAR APLICATIVOS   Mesmo sendo um total iniciante vamos explicar para você como criar aplicativos profissionais. Utilizaremos a linguagem HTML, CSS, Javascript em união com Apache Cordova. MODELO DE NEGÓCIO  Vamos ensinar como ganhar dinheiro* fazendo aplicativos. Apresentamos os 4 pilares básicos para a monetização de um aplicativos e como fazer para ser bem-sucedido. ATENDIMENTO AO CLIENTE - Vamos dar atenção também a parte humana do processo. Como técnicas de atendimento e precificação, para você convencer seus futuros clientes a fechar negócio com você. Veja os módulos do curso aqui POR QUE FAZER ESTE CURSO? CERTIFICAÇÃO PROFISSIONAL A conclusão deste curso oferece certificação profissional válida em todo território nacional. Podendo portanto ser colocado no seu curriculum, com duração total de 10 horas. GARANTIA Se por algum motivo você achar que est...

Criando um filtro de busca customizável com JavaScript funcional

Tutoriais utilizando bibliotecas e frameworks para state management se tornaram comuns. Apesar disso, já que muita gente usa muitos frameworks diferentes, muitas vezes precisamos falar sobre a plataforma que permite isso tudo: a odiadíssima ferramenta que é o JavaScript, na sua forma mais pura — conforme descrito com documentações excelentes como a da MDN . Esse tutorial também pode ser útil para quem está iniciando em JavaScript e desenvolvimento em geral já começar com alguma ideia do que é programação funcional. O termo está se tornando popular e quem não subir nesse barco pode ficar para trás em pouco tempo. Não vamos adentrar nos detalhes do que é programação funcional neste artigo — isso é assunto para outras horas de conversa. Aqui, ficaremos no rápido e simples: alcançar nosso objetivo, evitando mutações dos dados e estado global. Iniciando o projeto Pelo bem da simplicidade, vamos manter tudo num único arquivo, que vai ter essa cara: <!DOCTYPE HTML> ...