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