TOC

This article is currently in the process of being translated into Spanish (~98% done).

XML:

Writing XML with the XmlDocument class

En el capítulo anterior, escribimos XMl usando la clase XmlWriter. Sin embargo, para algunas situaciones, especialmente cuando hacemos una actualización de XML ya existente, si usamos la clase XmlDocument, puede venirnos al pelo. Deberíamos ser conscientes del gran uso de memoria, sobre todo para documentos de XML largos. Aquí hay algún código:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            XmlNode rootNode = xmlDoc.CreateElement("users");
            xmlDoc.AppendChild(rootNode);

            XmlNode userNode = xmlDoc.CreateElement("user");
            XmlAttribute attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "42";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "John Doe";
            rootNode.AppendChild(userNode);

            userNode = xmlDoc.CreateElement("user");
            attribute = xmlDoc.CreateAttribute("age");
            attribute.Value = "39";
            userNode.Attributes.Append(attribute);
            userNode.InnerText = "Jane Doe";
            rootNode.AppendChild(userNode);

            xmlDoc.Save("test-doc.xml");
        }
    }
}

Y el XML resultante:

<users>
  <user age="42">John Doe</user>
  <user age="39">Jane Doe</user>
</users>

Como puede ver, este es un un poco más orientado a objetos que la aproximación de XmlWriter, y requiere un poco de más código. Lo que hacemos es que instanciamos un objeto XmlDocument, el cual usaremos para crear ambos nuevos elementos y atributos, usando los métodos CreateElement() y CreateAttribute(). Cada vez que lo hacemos, agregamos al final los elementos, ya sea directamente al documento, o a otro elemento. Puede ver esto en el ejemplo, donde el elemento raíz ("users") es agregado directamente al documento, mientras que los elementos "user" son agregados al elemento raíz. Los atributos son por supuesto agregados a los elementos donde pertenecen, usando el método Append() en la propiedad Attributes. El documento XML entero es escrito al disco en la última línea, donde usamos el método Save().

Ahora, como ya se mencionó, esto requiere un poco de más código que cuando usamos el XmlWriter, pero imagine una situación donde solo necesita ir a un document XML existente y cambiar unas pocas cosas. Usando la aproximación XmlWriter, tendría que leer toda la información usando un XmlReader, almacenarlo, cambiarlo y luego escribir la información entera de regreso usando el XmlWriter. Debido a que el XmlDocument mantiene todo en memoria para usted, actualizar un archivo XML existente se vuelve mucho más simple. El siguiente ejemplo abre el archivo "test-doc.xml" que creamos en el capítulo previo e incrementa la edad de cada "user" por uno. Vea que tan fácil es esto:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace WritingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("test-doc.xml");
            XmlNodeList userNodes = xmlDoc.SelectNodes("//users/user");
            foreach(XmlNode userNode in userNodes)
            {
                int age = int.Parse(userNode.Attributes["age"].Value);
                userNode.Attributes["age"].Value = (age + 1).ToString();
            }
            xmlDoc.Save("test-doc.xml");           
        }
    }
}

Cargamos el archivo XML y buscamos todos los nodos <user>. Entonces iteramos através de ellos, leemos el atributo de edad en una variable entera, y luego escribimos el valor de regreso al nodo y al atributo, después de incrementar el valor por 1. Al final, salvamos el documento de regreso con el mismo archivo y si lo abre, verá que nuestros usuarios todos tendrán un cumpleaños más. ¡Muy genial!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!