This article has been localized into Portuguese by the community.
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!