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# se proporcionan varias bibliotecas y enfoques potentes para trabajar con XML, desde el clásico XmlDocument hasta el moderno LINQ to XML. En este artículo analizaremos las herramientas principales, sus características y proporcionaremos ejemplos prácticos para tareas reales.
1. Bibliotecas principales para trabajar con XML en .NET
La plataforma .NET ofrece a los desarrolladores varias API para procesar XML:
- System.Xml (XmlDocument, XmlReader, XmlWriter) — el enfoque clásico DOM (Document Object Model). Permite cargar todo el documento XML en memoria y trabajar con él como un árbol de nodos.
- LINQ to XML (XDocument, XElement, XAttribute) — una API moderna, más ligera y conveniente, integrada con LINQ. Se recomienda para la mayoría de los proyectos nuevos.
- XmlSerializer — para la serialización y deserialización automática de objetos C# a XML y viceversa.
- XPath (SelectSingleNode, SelectNodes) — lenguaje de consultas para navegar por documentos XML. Es compatible tanto con
XmlDocumentcomo conXDocument(a través de extensiones).
2. LINQ to XML: enfoque moderno
La biblioteca System.Xml.Linq (LINQ to XML) es la opción preferida para trabajar con XML en C#. Ofrece una sintaxis limpia, carga ligera y soporte para consultas LINQ.
Creación de un 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 y Paz"), new XElement("author", "León Tolstói"), new XElement("price", 599.99m) ), new XElement("book", new XAttribute("id", "2"), new XElement("title", "Crimen y Castigo"), new XElement("author", "Fiódor Dostoyevski"), new XElement("price", 450.00m) ) ));
doc.Save("books.xml");Carga y lectura de XML
XDocument loadedDoc = XDocument.Load("books.xml");
// Obtener todos los librosvar 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($"Libro #{id}: {title} — {author}");}Consultas con LINQ
// Seleccionar libros con precio mayor a 500 rublosvar 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} rub.");}3. XmlDocument clásico
Si trabaja con código heredado o necesita un control total sobre el DOM, use XmlDocument del espacio de nombres System.Xml.
Carga y navegación
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); }}Agregar un nuevo nodo
XmlNode newBook = xmlDoc.Cre También en la biblioteca
TypeStack/routing-controllers para TypeScript: guía completa con ejemplos
Monitoreo de aplicaciones en Rust: bibliotecas y herramientas para el seguimiento del rendimiento
Trabajo con XML en Rust: bibliotecas quick-xml, roxmltree y serde_xml_rs
OpenAPI / Swagger para Java: guía completa con ejemplos
Limitación de Tasa en C# (.NET): guía de la biblioteca System.Threading.RateLimiting