En su día escribí una serie de artículos sobre como leer, escribir, insertar, modificar y borrar datos en archivos XML utilizando algunas de las clases que encontramos en el espacion de nombres System.Xml.
Lo cierto es que esta serie tuvo mucho éxito, tanto en comentarios como en visitas. Aún hoy en día sigue siendo de los más buscados entre las visitas a este blog. Así que me he animado a escribir otra serie, idéntica en concepto a la anterior, pero esta vez manipulando los archivos XML con LINQ.
En este primer artículo vamos a ver como escribir un documento XML completo utilizando LINQ y las clases que encontraremos como es lógico en el espacio de nombres System.Xml.Linq. En concreto utilizaremos 3 únicas clases:
- XDocument. Representa el documento XML.
- XDeclaration. Contiene información relativa a la declaración del document XML.
- XElement. Representa un nodo del documento. Este nodo puede ser el nodo raiz, un nodo hijo o cualquier nodo anidado en el documento.
Antes de ver el código de ejemplo, comentaros que la estructura del documento XML que vamos a tratar en toda la serie de artículos es el mismo que en la serie anterior.
¡Sin más preámbulos el código!
static void EscribirXml()
{
//Declaramos el documento y su definición
XDocument document = new XDocument(
new XDeclaration("1.0", "utf-8", null));
//Creamos el nodo raiz y lo añadimos al documento
XElement nodoRaiz = new XElement("empleados");
document.Add(nodoRaiz);
for (int i = 1; i <= 5; i++)
{
//Creamos el nodo empleado y el contenido con sus nodos hijos
XElement nodoEmpleado = new XElement("empleado");
nodoEmpleado.Add(new XElement("idEmpleado", i));
nodoEmpleado.Add(new XElement("nombre", "UnNombre" + i));
nodoEmpleado.Add(new XElement("apellidos", "UnosApellidos" + i));
nodoEmpleado.Add(new XElement("numeroSS", "111-111-11" + i));
nodoEmpleado.Add(new XElement("telefonos",
new XElement("fijo", "90000000" + i),
new XElement("movil", "60000000" + i)));
//Añadirmos el nodo empleado y escribimos en el documento
nodoRaiz.Add(nodoEmpleado);
}
document.Save(xmlPath);
}
Como podemos apreciar es mucho más sencillo que el ejemplo "antiguo" y sobre todo más intuitivo y elegante. Llamaros la atención únicamente sobre la clase XElement que admite un segundo parámetro de tipo params object[] que nos permite ir anidando directa y sucesivamente los nodos hijos que necesitemos. Como en el ejemplo los dos nodos correspondientes a los teléfonos del empleado.
El resultado obtenido al ejecutar este método sería el siguiente.
<?xml version="1.0" encoding="utf-8"?>
<empleados>
<empleado>
<idEmpleado>1</idEmpleado>
<nombre>UnNombre1</nombre>
<apellidos>UnosApellidos1</apellidos>
<numeroSS>111-111-111</numeroSS>
<telefonos>
<fijo>900000001</fijo>
<movil>600000001</movil>
</telefonos>
</empleado>
<empleado>
<idEmpleado>2</idEmpleado>
<nombre>UnNombre2</nombre>
<apellidos>UnosApellidos2</apellidos>
<numeroSS>111-111-112</numeroSS>
<telefonos>
<fijo>900000002</fijo>
<movil>600000002</movil>
</telefonos>
</empleado>
<empleado>
<idEmpleado>3</idEmpleado>
<nombre>UnNombre3</nombre>
<apellidos>UnosApellidos3</apellidos>
<numeroSS>111-111-113</numeroSS>
<telefonos>
<fijo>900000003</fijo>
<movil>600000003</movil>
</telefonos>
</empleado>
<empleado>
<idEmpleado>4</idEmpleado>
<nombre>UnNombre4</nombre>
<apellidos>UnosApellidos4</apellidos>
<numeroSS>111-111-114</numeroSS>
<telefonos>
<fijo>900000004</fijo>
<movil>600000004</movil>
</telefonos>
</empleado>
<empleado>
<idEmpleado>5</idEmpleado>
<nombre>UnNombre5</nombre>
<apellidos>UnosApellidos5</apellidos>
<numeroSS>111-111-115</numeroSS>
<telefonos>
<fijo>900000005</fijo>
<movil>600000005</movil>
</telefonos>
</empleado>
</empleados>