TOC

This article has been localized into Portuguese by the community.

XML:

Escrevendo XML com a classe XmlDocument

No capítulo anterior, escrevemos XML usando a classe XmlWriter. No entanto, para algumas situações, especialmente ao fazer atualizações de XML existente, o uso da classe XmlDocument pode ser útil. Você deve estar ciente do maior consumo de memória, principalmente para grandes documentos XML. Aqui está algum 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");
        }
    }
}

E o XML resultante:

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

Como você pode ver, isso é um pouco mais orientado a objetos do que a abordagem XmlWriter, e requer um pouco mais de código. O que fazemos é que instanciamos um objeto XmlDocument, que usaremos para criar novos elementos e atributos, usando os métodos CreateElement() e CreateAttribute(). Cada vez que fazemos isso, anexamos os elementos diretamente ao documento ou a outro elemento. Você pode ver isso no exemplo, em que o elemento raiz ("usuários") é anexado diretamente ao documento, enquanto os elementos do usuário são anexados ao elemento raiz. Obviamente, os atributos são anexados aos elementos aos quais pertencem, usando o método Append() na propriedade Attributes. Todo o documento XML é gravado no disco na última linha, onde usamos o método Save().

Agora, como já mencionado, isso requer um pouco mais de código do que quando se usa o XmlWriter, mas imagine uma situação em que você só precisa entrar em um documento XML existente e alterar alguns valores. Usando a abordagem XmlWriter, você teria que primeiro ler todas as informações usando um XmlReader, armazená-lo, alterá-lo e, em seguida, gravar todas as informações novamente usando o XmlWriter. Porque o XmlDocument contém tudo na memória para você, atualizando um arquivo XML existente se torna muito mais simples. O exemplo a seguir abre o arquivo "test-doc.xml" que criamos no capítulo anterior e aumenta a idade de cada usuário em um. Veja como é fácil:

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");           
        }
    }
}

Nós carregamos o arquivo XML e solicitamos todas as tags <user> nós. Nós, então, percorremos eles, lemos o atributo age em uma variável inteira, e então escrevemos o valor de volta para o nó e para o atributo, depois de aumentar o valor em 1. Por fim, salvamos o documento de volta no mesmo arquivo e se você abri-lo, você verá que todos os nossos usuários tiveram apenas um aniversário. Muito legal!


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!