Trabalhando 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 ferramentas poderosas para trabalhar com XML: desde o clássico XmlDocument até o moderno XDocument do LINQ to XML e a serialização avançada com XmlSerializer. Neste artigo, abordaremos todas as principais abordagens com exemplos práticos.
1. Abordagem clássica: XmlDocument
System.Xml.XmlDocument é um modelo DOM (Document Object Model) que carrega todo o documento XML na memória como uma árvore de nós. Essa abordagem é familiar para desenvolvedores desde os tempos do .NET Framework 1.0.
Carregando e lendo XML
using System.Xml;
XmlDocument doc = new XmlDocument();doc.Load("books.xml");
// Obtém o elemento raizXmlElement root = doc.DocumentElement;
// Percorre todos os nós filhosforeach (XmlNode node in root.ChildNodes){ if (node.Name == "book") { string title = node["title"]?.InnerText; string author = node["author"]?.InnerText; Console.WriteLine($"Livro: {title}, Autor: {author}"); }}Criando e escrevendo XML
XmlDocument newDoc = new XmlDocument();XmlElement rootElem = newDoc.CreateElement("library");newDoc.AppendChild(rootElem);
XmlElement book = newDoc.CreateElement("book");rootElem.AppendChild(book);
XmlElement title = newDoc.CreateElement("title");title.InnerText = "O Mestre e Margarida";book.AppendChild(title);
newDoc.Save("library.xml");Vantagens: Simplicidade, suporte a XPath, controle total sobre o DOM.
Desvantagens: Consome muita memória, sem suporte a LINQ.
2. Abordagem moderna: LINQ to XML (XDocument)
A partir do .NET 3.5, recomenda-se usar o namespace System.Xml.Linq. As classes XDocument, XElement e XAttribute fornecem uma API mais leve e funcional com integração total ao LINQ.
Lendo XML com XDocument
using System.Xml.Linq;
XDocument xdoc = XDocument.Load("books.xml");
var books = xdoc.Descendants("book") .Select(b => new { Title = b.Element("title")?.Value, Author = b.Element("author")?.Value, Year = (int?)b.Element("year") });
foreach (var book in books){ Console.WriteLine($"{book.Title} — {book.Author} ({book.Year})");}Criando XML com XElement
XDocument xdoc = new XDocument( new XElement("library", new XElement("book", new XElement("title", "Crime e Castigo"), new XElement("author", "F.M. Dostoiévski"), new XAttribute("id", "1") ) ));
xdoc.Save("library2.xml");Vantagens: Sintaxe concisa, suporte a LINQ, menor consumo de memória.
Desvantagens: Pode ser incomum para desenvolvedores acostumados com DOM.
3. Serialização de objetos em XML: XmlSerializer
Se você tem classes C#, pode convertê-las automaticamente para XML e vice-versa usando System.Xml.Serialization.XmlSerializer.
Exemplo de classe para serialização
[Serializable]public class Book{ [XmlAttribute("id")] public int Id { get; set; }
[XmlElement("title")] public string Title { get; set; }
[XmlElement("author")] public string Author { get; set; }
[XmlIgnore] public string InternalNote { get; set; }}Serialização (objeto → XML)
using System.Xml.Serialization;using System.IO;
Book book = new Book { Id = 1, Title = "Guerra e Paz", Author = "L.N. Tolstói" };
XmlSeria