Olá pessoal,
Semana passada recebi um desafio muito interessante, e que gostaria de compartilhar com todos. O desafio foi que não estávamos conseguindo serializar objetos com Namespaces. Uma definição para Namespace em arquivos Xml segundo o w3schools é que eles servem para eliminar a duplicidade dos elementos.
Para quem não sabe o que é o namespace em um arquivo xml, aqui vai um exemplo (destacado pelo quadrado vermelho):
Agora que já sabemos o que é e para que serve, vamos criar um modelo do documento acima.
Para isso precisamos seguir alguns passos:
- Criar um projeto do tipo Console Application
- Adicionar à solution um projeto do tipo Class Library.
- Adicionar a classe Perguntas
- Adicionar a classe Pergunta

A codificação para o arquivo Perguntas.cs deverá ser a seguinte:
[Serializable]
[XmlRoot(ElementName = "Perguntas")]
public class Perguntas {
private int _id;
private List<Pergunta> _pergunta;
public Perguntas() {
_pergunta = new List<Pergunta>();
}
[XmlAttribute(AttributeName = "ID")]
public int ID {
get { return _id; }
set { _id = value; }
}
[XmlElement(ElementName = "Pergunta")]
public List<Pergunta> Pergunta {
get { return _pergunta; }
set { _pergunta = value; }
}
}
A codificação para o arquivo Pergunta.cs deverá ser a seguinte:
[Serializable]
[XmlRoot(ElementName = "Pergunta")]
public class Pergunta {
private string _TextoPergunta;
private string _resposta;
public Pergunta() {
// EMPTY CONSTRUCTOR
}
public Pergunta(string pergunta, string resposta) {
_TextoPergunta = pergunta;
_resposta = resposta;
}
[XmlElement(ElementName = "TextoPergunta")]
public string TextoPergunta {
get { return _TextoPergunta; }
set { _TextoPergunta = value; }
}
[XmlElement(ElementName = "Resposta")]
public string Resposta {
get { return _resposta; }
set { _resposta = value; }
}
}
Depois de deixar a estrutura pronta. Vamos até o arquivo Program.cs do projeto Console Application.
Com a classe aberta vamos codificar o seguinte:
static void Main(string[] args) {
Perguntas perguntas = new Perguntas();
perguntas.Pergunta.Add(new Pergunta("1- Como devo fazer isso?", "Você não pode fazer isso."));
perguntas.Pergunta.Add(new Pergunta("2- E se eu não conseguir?", "Tente de outra forma."));
XmlDocument documento = new XmlDocument();
string respostaXml = Serializar(perguntas);
documento.LoadXml(respostaXml);
documento.Save(@"c:\temp\xmlNameSpace.xml");
}
/// <summary>
/// CLASSE RESPONSÁVEL PARA SERIALIZAR OS OBJETOS
/// </summary>
/// <param name="objeto">Uma variável do tipo Referência</param>
/// <returns>Retorna uma string contendo o objeto serializado. (formato XML)</returns>
public static string Serializar(object objeto) {
StringWriter result = new StringWriter();
XmlSerializer xmlTrace = new XmlSerializer(objeto.GetType());
try {
xmlTrace.Serialize(result, objeto);
} catch (Exception ex) {
xmlTrace.Serialize(result, ex);
} finally {
result.Close();
}
return result.ToString();
}
Com tudo codificado, vamos agora executar a aplicação. E se o processo ocorreu sem problemas, vamos até a pasta “c:\temp” e abrir o arquivo xmlNameSpace.xml. Ele deverá estar exatamente igual a primeira imagem deste artigo.
Até agora fizemos o simples. Como podemos deixar o arquivo com prefixos igual à imagem abaixo?

Para isso, devemos adicionar dois namespace. O namespace é composto principalmente de duas coisas:
- A url de definição e
- Um Prefixo.
O primeiro passo é avisar para a função de serialização que serão adicionados dois namespaces ao processo. Para isso devemos ir na função serializar e deixá-la da seguinte forma:
public static string Serializar(object objeto) {
StringWriter result = new StringWriter();
XmlSerializer xmlTrace = new XmlSerializer(objeto.GetType());
/*
* NAMESPACES DE VALIDAÇÃO
*/
XmlSerializerNamespaces ser = new XmlSerializerNamespaces();
ser.Add("marcos", "http://www.marcossabino.com");
ser.Add("sabino", "http://marcossabinofilho.spaces.live.com");
/*
* ADICIONANDO O "" NO NAMESPACES, É ELIMINADO O LIXO DO PROCESSO
*/
ser.Add("", "");
try {
xmlTrace.Serialize(result, objeto, ser);
} catch (Exception ex) {
xmlTrace.Serialize(result, ex);
} finally {
result.Close();
}
return result.ToString();
}
O próximo passo é ir na classe Pergunta e adicionar o seguinte parâmetro nas propriedades:
Agora é só rodar e ver o resultado:
Essa técnica de usar os namespace, pode ser usado direto com os elementos, tanto para os atributos do Node.
Agora que eu já tive um desafio, que tal passar vocês tentarem deixar o arquivo xml igual o abaixo?
Referência
[ W3Schools – Xml Namespaces ]
Espero que tenham gostado,
[]’s
Posted
8 Jun 2009 16:53
by
Marcos Sabino Filho