Trabajo con XML en C# (.NET): desde lo básico hasta técnicas avanzadas
XML (eXtensible Markup Language) sigue siendo uno de los formatos clave para almacenar y transmitir datos estructurados en el ecosistema .NET. Ya sea que esté creando archivos de configuración, intercambiando datos con servicios web o procesando documentos, las herramientas integradas de C# proporcionan instrumentos flexibles y eficientes para trabajar con XML. En este artículo, analizaremos tres enfoques principales: el clásico XmlDocument, el moderno XDocument (LINQ to XML) y los de flujo XmlReader/XmlWriter.
1. XmlDocument clásico (modelo DOM)
La clase System.Xml.XmlDocument implementa DOM (Document Object Model): carga todo el documento XML en la memoria RAM como un árbol de nodos. Es conveniente para documentos pequeños y medianos cuando se requiere navegación y modificación frecuentes.
Carga y lectura de XML
using System.Xml;
XmlDocument doc = new XmlDocument();doc.Load("books.xml"); // carga desde archivo
// Obtener el elemento raízXmlElement root = doc.DocumentElement;
// Seleccionar todos los elementos bookXmlNodeList books = root.SelectNodes("//book");foreach (XmlNode book in books){ string title = book["title"].InnerText; string author = book["author"].InnerText; Console.WriteLine($"{title} — {author}");}Creación y guardado de XML
XmlDocument doc = new XmlDocument();XmlElement root = doc.CreateElement("library");doc.AppendChild(root);
XmlElement book = doc.CreateElement("book");book.SetAttribute("id", "1");
XmlElement title = doc.CreateElement("title");title.InnerText = "Guerra y paz";book.AppendChild(title);
root.AppendChild(book);doc.Save("library.xml");2. LINQ to XML moderno (XDocument)
El espacio de nombres System.Xml.Linq ofrece una API más concisa y funcional. XDocument y XElement permiten escribir código en estilo LINQ, lo que es especialmente útil para consultas y transformaciones.
Análisis con XDocument
using System.Xml.Linq;
XDocument doc = XDocument.Load("books.xml");
var books = doc.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.Year})");}Creación de XML con constructores
XDocument doc = new XDocument( new XElement("library", new XElement("book", new XAttribute("id", "1"), new XElement("title", "Crimen y castigo"), new XElement("author", "F.M. Dostoievski") ) ));doc.Save("library.xml");Ventajas de XDocument:
- Soporte de consultas LINQ para filtrar y proyectar datos.
- Sintaxis más legible para crear elementos mediante constructores anidados.
- Manejo automático de espacios de nombres mediante
XNamespace.
3. Procesamiento por flujo: XmlReader y XmlWriter
Para trabajar con archivos XML grandes (cientos de megabytes o gigabytes), el uso de XmlDocument o XDocument puede provocar desbordamiento de memoria. En estos casos, se utilizan las clases de flujo XmlReader y XmlWriter, que procesan los datos secuencialmente sin cargar todo el documento.
Lectura con XmlReader
using (XmlReader reader = XmlReader.Create("large.xml")){ while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "record") { string id = reader.Get