Neste post vou mostrar como montar um XML a partir de uma classe modelo utilizando o Serilize do c#.
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.
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.
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.
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
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