TOC

This article has been localized into Czech by the community.

XML:

Použití XPath s třídou XmlDocument

V předchozí kapitole jsme použili třídu XmlDocument k získání informací z XML souboru. Udělali jsme to pomocí řady volání vlastnosti ChildNodes, což bylo poměrně jednoduché, protože příklad byl velmi jednoduchý. Pro čitelnost našeho kódu to ale moc nepomohlo, takže v této kapitole se podíváme na jiný přístup, který je rozhodně mocnější a přitom snadněji čitelný a udržovatelný. Technologii, kterou pro to použijeme, se nazývá XPath a spravuje ji stejná organizace, která vytvořila standard XML. XPath je ve skutečnosti celý dotazovací jazyk s mnoha možnostmi, ale jelikož toto není tutoriál na XPath, podíváme se jen na některé základní dotazy. I ve svých nejjednodušších formách je však XPath stále mocný, jak uvidíte v následujících příkladech.

Třída XmlDocument má několik metod, které přijímají dotaz XPath jako parametr a poté vracejí výsledné XmlNode(s). V této kapitole se podíváme na dvě metody: metodu SelectSingleNode(), která vrátí jediný XmlNode na základě poskytnutého dotazu XPath, a metodu SelectNodes(), která vrátí kolekci XmlNodeList objektů XmlNode na základě poskytnutého dotazu XPath.

Vyzkoušíme obě výše zmíněné metody, ale místo použití XML s informacemi o měnách, které jsme testovali v předchozích kapitolách, nyní vyzkoušíme nový zdroj XML. RSS kanály jsou v podstatě XML dokumenty sestavené konkrétním způsobem, aby umožnily mnoha různým čtečkám zpráv parsovat a zobrazovat stejné informace vlastním způsobem.

Použijeme RSS kanál od CNN, který se nachází na http://rss.cnn.com/rss/edition_world.rss, s novinkami z celého světa. Pokud jej otevřete ve vašem prohlížeči, váš prohlížeč to může zobrazit pěkným způsobem, což vám umožní získat přehled o kanálu a přihlásit se k odběru, ale nenechte se tím zmást: Pod pokličkou je to jen XML, což uvidíte, pokud provedete "Zobrazit zdroj" ve vašem prohlížeči. Uvidíte, že kořenový prvek se nazývá "rss". Prvek rss obvykle obsahuje jeden nebo několik prvků "channel", a v tomto prvku můžeme najít informace o kanálu stejně jako uzly "item", které jsou novinkové položky, o které obvykle máme zájem.

V následujícím příkladu použijeme metodu SelectSingleNode() k získání názvu kanálu. Pokud se podíváte na XML, uvidíte, že existuje element <title> jako podřízený element elementu <channel>, který je pak podřízeným elementem elementu <rss>, kořene. Tento dotaz lze v XPath popsat takto:

//rss/channel/title

Jednoduše napíšeme názvy elementů, které hledáme, oddělené lomítkem (/), což udává, že element by měl být potomkem elementu před předcházejícím lomítkem. Použití tohoto XPath je tak jednoduché jako toto:

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

namespace ParsingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
            XmlNode titleNode = xmlDoc.SelectSingleNode("//rss/channel/title");
            if(titleNode != null)
                Console.WriteLine(titleNode.InnerText);
            Console.ReadKey();   
        }
    }
}

Používáme metodu SelectSingleNode() k nalezení elementu <title>, která jednoduše přijímá náš XPath jako parametr typu řetězec. Poté zkontrolujeme, zda to vrátilo výsledek, a pokud ano, vytiskneme InnerText nalezeného uzlu, což by měl být název RSS kanálu.

V dalším příkladu použijeme metodu SelectNodes() k nalezení všech uzlů item v RSS kanálu a poté vytiskneme informace o nich:

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

namespace ParsingXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
            XmlNodeList itemNodes = xmlDoc.SelectNodes("//rss/channel/item");
            foreach(XmlNode itemNode in itemNodes)
            {
                XmlNode titleNode = itemNode.SelectSingleNode("title");
                XmlNode dateNode = itemNode.SelectSingleNode("pubDate");
                if((titleNode != null) && (dateNode != null))
                    Console.WriteLine(dateNode.InnerText + ": " + titleNode.InnerText);
            }
            Console.ReadKey();   
        }
    }
}

Metoda SelectNodes() přijímá dotaz XPath jako řetězec, stejně jako jsme viděli v předchozím příkladu, a poté vrátí seznam objektů XmlNode v kolekci XmlNodeList. Procházíme ji pomocí smyčky foreach a z každého z uzlů item požádáme o podřízený uzel nazvaný title a pubDate (datum publikace) použitím metody SelectSingleNode() přímo na uzel item. Pokud oba dostaneme, vytiskneme datum a název na stejný řádek a poté pokračujeme.

V našem příkladu jsme chtěli dvě různé hodnoty z každého uzlu item, proto jsme požádali o uzly item a pak jsme každý z nich zpracovali. Pokud bychom však potřebovali například pouze názvy každé položky, mohli bychom změnit dotaz XPath na něco takového:

//rss/channel/item/title

To bude odpovídat každému uzlu title v každém z uzlů item. Zde je dotaz s nějakým kódem C#, aby se to vše uskutečnilo:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
XmlNodeList titleNodes = xmlDoc.SelectNodes("//rss/channel/item/title");
foreach(XmlNode titleNode in titleNodes)
    Console.WriteLine(titleNode.InnerText);            
Console.ReadKey();

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!