Trabalho com XML em C# (.NET): Guia Completo
XML (eXtensible Markup Language) continua sendo um dos principais formatos para armazenamento e transmissão de dados estruturados no ecossistema .NET. Em C#, existem várias bibliotecas e abordagens poderosas para trabalhar com XML, desde o clássico XmlDocument até o moderno LINQ to XML. Neste artigo, abordaremos as principais ferramentas, suas características e forneceremos exemplos práticos para tarefas reais.
1. Principais bibliotecas para trabalhar com XML no .NET
A plataforma .NET oferece aos desenvolvedores várias APIs para processamento de XML:
- System.Xml (XmlDocument, XmlReader, XmlWriter) — abordagem clássica DOM (Document Object Model). Permite carregar todo o documento XML na memória e trabalhar com ele como uma árvore de nós.
- LINQ to XML (XDocument, XElement, XAttribute) — API moderna, mais leve e conveniente, integrada ao LINQ. Recomendado para a maioria dos novos projetos.
- XmlSerializer — para serialização e desserialização automática de objetos C# para XML e vice-versa.
- XPath (SelectSingleNode, SelectNodes) — linguagem de consulta para navegação em documentos XML. Suportado tanto no
XmlDocumentquanto noXDocument(através de extensões).
2. LINQ to XML: abordagem moderna
A biblioteca System.Xml.Linq (LINQ to XML) é a escolha preferida para trabalhar com XML em C#. Ela oferece sintaxe limpa, carregamento leve e suporte a consultas LINQ.
Criação de documento XML
using System.Xml.Linq;
XDocument doc = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("books", new XElement("book", new XAttribute("id", "1"), new XElement("title", "Guerra e Paz"), new XElement("author", "Liev Tolstói"), new XElement("price", 599.99m) ), new XElement("book", new XAttribute("id", "2"), new XElement("title", "Crime e Castigo"), new XElement("author", "Fiódor Dostoiévski"), new XElement("price", 450.00m) ) ));
doc.Save("books.xml");Carregamento e leitura de XML
XDocument loadedDoc = XDocument.Load("books.xml");
// Obtendo todos os livrosvar allBooks = loadedDoc.Descendants("book");
foreach (var book in allBooks){ string id = book.Attribute("id")?.Value; string title = book.Element("title")?.Value; string author = book.Element("author")?.Value; Console.WriteLine($"Livro #{id}: {title} — {author}");}Consultas com LINQ
// Selecionando livros mais caros que 500 reaisvar expensiveBooks = from book in loadedDoc.Descendants("book") where (decimal)book.Element("price") > 500 select new { Title = (string)book.Element("title"), Price = (decimal)book.Element("price") };
foreach (var b in expensiveBooks){ Console.WriteLine($"{b.Title}: {b.Price} reais.");}3. XmlDocument clássico
Se você está trabalhando com código legado ou precisa de controle total sobre o DOM, use XmlDocument do namespace System.Xml.
Carregamento e navegação
using System.Xml;
XmlDocument xmlDoc = new XmlDocument();xmlDoc.Load("books.xml");
XmlNode root = xmlDoc.DocumentElement;XmlNodeList bookNodes = root.SelectNodes("book");
foreach (XmlNode node in bookNodes){ XmlNode titleNode = node.SelectSingleNode("title"); if (titleNode != null) { Console.WriteLine(titleNode.InnerText); }}Adicionando um novo nó
XmlNode newBook = xmlDoc.Cre