This article has been localized into Czech by the community.
Čtení XML s třídou XmlDocument
Jak bylo popsáno v předchozí kapitole, XmlDocument spotřebovává více paměti a může být o něco pomalejší než přístup pomocí XmlReader. Avšak pro mnohé účely může být práce s XmlDocument jednodušší a často vyžaduje méně kódu. Jakmile byl obsah XML přečten, můžete data číst hierarchicky, přesně jako struktura XML, s kořenovým prvkem, který může mít potomky, kteří mohou mít další potomky a tak dále. V předchozí kapitole jsme analyzovali XML data od Evropské centrální banky, která nám mohla říct o aktuálních směnných kurzech měn, a teď uděláme totéž, ale použijeme třídu XmlDocument.
XML lze najít na aktuální URL (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml) a data, která potřebujeme, jsou v elementech <cube>. Ve stromové struktuře to vypadá nějak takto:
<gesmes:Envelope>
[other child nodes]
<Cube>
<Cube time="2011-04-12">
<Cube currency="USD" rate="1.4470"/>
<Cube currency="JPY" rate="121.87"/>
…
gesmes:Envelope je náš kořenový prvek, ke kterému můžeme přistupovat pomocí vlastnosti DocumentElement. Poté budeme moci přistupovat k podřízeným uzlům tohoto uzlu pomocí kolekce vlastností ChildNodes. V našem příkladu chceme podřízené uzly tři úrovně pod kořenovým/document elementem. To můžeme udělat pomocí následujícího kódu, který v podstatě dělá totéž co kód založený na XmlReader v předchozí kapitole:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
foreach(XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[2].ChildNodes[0].ChildNodes)
Console.WriteLine(xmlNode.Attributes["currency"].Value + ": " + xmlNode.Attributes["rate"].Value);
Console.ReadKey();
}
}
}
Jak vidíte, přistupujeme k uzlům Cube postupným procházením hierarchie ChildNodes. Od DocumentElement (kořenového prvku) požádáme o třetí podřízený uzel (indexovaný od nuly), poté požádáme o první podřízený uzel tohoto uzlu a poté požádáme o celou kolekci podřízených uzlů. Samozřejmě to je možné jen proto, že známe strukturu XML dokumentu, a rozhodně to není velmi flexibilní, ale je snadné to později změnit. Nicméně způsob, jakým navigujete v XML dokumentu, velmi závisí na zdroji XML a datech, která potřebujete. Pro tento příklad bude výše uvedený postup perfektně fungovat a dokonce s velmi omezeným množstvím kódu, ale pro jiné účely možná budete chtít použít trochu více kódu pro zvýšení čitelnosti.
Jakmile máme uzel s kurzem měny, přistupujeme ke dvěma vlastnostem, které nás zajímají, a poté je vypíšeme na konzoli, stejně jako v příkladu v předchozí kapitole.