Jump to content

Converter arquivos XML em objetos utilizando o C#


Kleverson Cruz

Postagens Recomendadas

Sabia que o .NET possuí classes nativas para manipulação de XML? Hoje vamos ver como é possível deserializar esse tipo de arquivo de uma forma bastante simples.

A serialização é o processo de converter um objeto em um fluxo de bytes para armazenar o objeto ou transmiti-lo para a memória, um banco de dados ou um arquivo. Sua finalidade principal é salvar o estado de um objeto para recriá-lo quando necessário. O processo inverso é chamado desserialização.(Microsoft Docs)

Vamos construir um cenário hipotético onde uma aplicação de terceiros exporta dados para um arquivo com extensão XML. Usaremos como exemplo o arquivo:

ListaDeMusicas.xml

<?xml version="1.0" encoding="UTF-8"?>
<lista>
	<musica id="1">
		<titulo>Morning Light</titulo>
		<artista>Nubiyan Twist, Ria Moran</artista>
		<duracao>5:27</duracao>
		<generos>
			<genero>Jazz</genero>
			<genero>Soul</genero>
		</generos>
	</musica>
	<musica id="2">
		<titulo>Last 100</titulo>
		<artista>Tom Misch, Yussef Dayes</artista>
		<duracao>4:00</duracao>
		<generos>
			<genero>Jazz</genero>
			<genero>Soul</genero>
			<genero>Electronic </genero>
		</generos>
	</musica>
</lista>

O arquivo contem um nó raiz 'lista' que vai possuir diversos elementos 'musica'.  Iremos construir uma aplicação em C# para listar as músicas, artistas e gêneros musicais.

 

Com o Visual Studio aberto, crie um projeto do tipo console app. Em seguida iremos criar uma classe que irá representar os elementos contidos no XML. O processo é bastante simples:

  • Copie o conteúdo do arquivo ListaDeMusicas.xml (Ctrl+C) para sua área de transferência.
  • Adicione em seu projeto um arquivo de classe vazia (Shift+Alt+C) com o nome Lista.cs

  • Abra o arquivo criado e no Visual Studio clique em: Edit > Paste special > Paste XML As Classes

image.png

 

Ao final desse procedimento deverá gerar um código semelhante ao descrito abaixo:

Lista.cs

using System.Xml.Serialization;

namespace ConverterXmlParaObjeto
{
    [XmlRoot("lista", Namespace = "", IsNullable = false)]
    public partial class Lista
    {
        [XmlElement("musica")]
        public listaMusica[] musicas { get; set; }
    }

    public partial class listaMusica
    {
        public string titulo { get; set; }

        public string artista { get; set; }

        public string duracao { get; set; }

        [XmlArrayItem("genero", IsNullable = false)]
        public string[] generos { get; set; }

        [XmlAttribute()]
        public byte id { get; set; }
    }
}

Obs: o código gerado no momento do Paste special deve estar um pouquinho diferente, pois removi comentários e trechos não obrigatórios.

 

Por fim, resta realizar a desserialização utilizando a classe XmlSerializer e inteirar os elementos para gerar o resultado no console.

O método Deserialize recebe o stream do arquivo lido, que depois de desserializado, é convertido para o tipo Lista através do cast.

Program.cs

using ConverterXmlParaObjeto;
using System.Xml.Serialization;

//Obtém o caminho do arquivo XML na pasta do projeto
string diretorioProjeto = Directory.GetCurrentDirectory();
string caminhoArquivo = Path.Combine(diretorioProjeto, "ListaDeMusicas.xml");

Stream reader = new FileStream(caminhoArquivo, FileMode.Open);

//Cria uma instância de XmlSerializer e desserializa para uma variavel do tipo Lista
XmlSerializer serializer = new(typeof(Lista));
Lista listaMusicas = (Lista)serializer.Deserialize(reader);

//Inteira nos elementos da lista e gera mensagens no console com os dados.
foreach (var musica in listaMusicas.musicas)
{
    Console.WriteLine($"#{musica.id} - {musica.titulo} - Duração: {musica.duracao}");
    Console.WriteLine($"Artistas: {musica.artista}\n");
}

A execução do código deve gerar a saída:

image.png

 

Esse foi apenas um exemplo simples de como podemos utilizar os recursos já disponíveis na linguagem e que podem ser úteis em diversas situações. Mais exemplos de uso da serialização estão disponíveis na documentação oficial:

https://docs.microsoft.com/pt-br/dotnet/standard/serialization/examples-of-xml-serialization

O código dessa postagem está disponível em: https://github.com/KleversonCruz/convert-xml-to-object

Fica aí também minhas recomendações de músicas mencionadas no XML de exemplo 😁

  • Curtir 4
  • Amei 1
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...