This article has been localized into Czech by the community.
Zápis XML s třídou XmlDocument
V předchozí kapitole jsme psali XML pomocí třídy XmlWriter. Nicméně pro některé situace, zejména při aktualizacích existujícího XML, se může hodit použití třídy XmlDocument. Měli byste být vědomi vyšší spotřeby paměti, hlavně pro velké XML dokumenty. Zde je nějaký kód:
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");
}
}
}
A výsledný XML:
<users>
<user age="42">John Doe</user>
<user age="39">Jane Doe</user>
</users>
Jak vidíte, je to o něco více objektově orientované než přístup XmlWriter a vyžaduje si to trochu více kódu. Co děláme, je, že instancujeme objekt XmlDocument, který budeme používat k vytváření jak nových elementů, tak atributů, použitím metod CreateElement() a CreateAttribute(). Pokaždé, když to uděláme, připojíme elementy, buď přímo k dokumentu, nebo k jinému elementu. To můžete vidět na příkladu, kde je kořenový element ("users") připojen přímo k dokumentu, zatímco elementy uživatele jsou připojeny ke kořenovému elementu. Atributy jsou samozřejmě připojeny k elementům, kam patří, použitím metody Append() na vlastnosti Attributes. Celý XML dokument je zapsán na disk na posledním řádku, kde používáme metodu Save().
Jak již bylo zmíněno, vyžaduje to trochu více kódu než při použití XmlWriter, ale představte si situaci, kdy potřebujete jen vejít do existujícího XML dokumentu a změnit několik hodnot. Použitím přístupu XmlWriter byste museli nejprve přečíst všechny informace pomocí XmlReader, uložit je, změnit je a poté celé informace zpět zapsat pomocí XmlWriter. Protože XmlDocument drží vše v paměti pro vás, aktualizace existujícího XML souboru se stává mnohem jednodušší. Následující příklad otevírá soubor "test-doc.xml", který jsme vytvořili v předchozí kapitole, a zvyšuje věk každého uživatele o jedna. Podívejte se, jaké to je jednoduché:
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");
}
}
}
Načteme XML soubor a požádáme o všechny uzly <user>. Poté je procházíme, načteme atribut věku do celočíselné proměnné a poté hodnotu zpět zapíšeme do uzlu a atributu, po zvýšení hodnoty o 1. Nakonec dokument uložíme zpět do stejného souboru a pokud jej otevřete, uvidíte, že naši uživatelé právě měli narozeniny. Docela fajn!