Trabajo con XML en C# (.NET): Guía completa
XML (Extensible Markup Language) sigue siendo uno de los formatos clave para almacenar y transmitir datos estructurados en el ecosistema .NET. En C# hay varias herramientas potentes disponibles para trabajar con XML: desde el clásico XmlDocument hasta el moderno XDocument de LINQ to XML y la serialización avanzada a través de XmlSerializer. En este artículo analizaremos todos los enfoques principales con ejemplos prácticos.
1. Enfoque clásico: XmlDocument
System.Xml.XmlDocument es un modelo DOM (Document Object Model) que carga todo el documento XML en memoria como un árbol de nodos. Este enfoque es familiar para los desarrolladores desde los tiempos de .NET Framework 1.0.
Carga y lectura de XML
using System.Xml;
XmlDocument doc = new XmlDocument();doc.Load("books.xml");
// Obtener el elemento raízXmlElement root = doc.DocumentElement;
// Recorrer todos los nodos hijosforeach (XmlNode node in root.ChildNodes){ if (node.Name == "book") { string title = node["title"]?.InnerText; string author = node["author"]?.InnerText; Console.WriteLine($"Libro: {title}, Autor: {author}"); }}Creación y escritura de 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 = "El Maestro y Margarita";book.AppendChild(title);
newDoc.Save("library.xml");Ventajas: Simplicidad, soporte XPath, control total sobre el DOM.
Desventajas: Consume mucha memoria, no tiene soporte LINQ.
2. Enfoque moderno: LINQ to XML (XDocument)
A partir de .NET 3.5, se recomienda usar el espacio de nombres System.Xml.Linq. Las clases XDocument, XElement y XAttribute proporcionan una API más ligera y funcional con integración completa con LINQ.
Lectura de XML con 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})");}Creación de XML con XElement
XDocument xdoc = new XDocument( new XElement("library", new XElement("book", new XElement("title", "Crimen y castigo"), new XElement("author", "F.M. Dostoievski"), new XAttribute("id", "1") ) ));
xdoc.Save("library2.xml");Ventajas: Sintaxis concisa, soporte LINQ, menor consumo de memoria.
Desventajas: Puede resultar poco familiar para desarrolladores acostumbrados al DOM.
3. Serialización de objetos a XML: XmlSerializer
Si tiene clases en C#, puede convertirlas automáticamente a XML y viceversa usando System.Xml.Serialization.XmlSerializer.
Ejemplo de clase para serialización
[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; }}Serialización (objeto → XML)
using System.Xml.Serialization;using System.IO;
Book book = new Book { Id = 1, Title = "Guerra y paz", Author = "L.N. Tolstói" };
XmlSeria También en la biblioteca
Generación de Swagger/OpenAPI en Kotlin: herramientas y ejemplos
Generación de PDF en Go: Revisión de bibliotecas y guía práctica
Trabajo con CSV en Swift (iOS/macOS): librería SwiftCSV y fundamentos de parsing