Práce s XML v C# (2.) - třída XmlTextReader v rubrice DOTNET
V dnešním díle si povíme o práci s XML pomocí třídy XmlTextReader.
Jedná se o velmi výkonné rozhraní umožňující pouze dopředné čtení, vhodné v případech, kdy vás zajímá obsah, nikoli struktura XML dokumentu. Protože se do paměti nenačítá celý obsah XML najednou, ale po jednotlivých uzlech, je výhodou malá paměťová náročnost.
Princip zpracování XML: vytvoření objektu XmlTextReader z nějakého souboru (url nebo jiného datového zdroje) a opakované volání metody XmlTextReader.Read(), dokud se nenačte hledaný obsah nebo nedosáhne konce dokumentu. Počáteční a koncové značky XML souboru považuje za samostatné uzly, do výstupu zahrnuje i uzly s prázdnými znaky (Whitespaces) pokud nenastavíme WhitespaceHandling na WhitespaceHandling.None. Přestože atributy uzlu jsou považovány za samostatné uzly, zpracovává je jinak než ostatní uzly a nejsou součástí normálního iteračního procesu pro průchod XML.
Nejdůležitější metody a vlastnosti:
NodeType – typ uzlu,
Name – název aktuálního uzlu,
Value – hodnota aktuálního uzlu,
AttributeCont – počet atributů aktuálního uzlu,
Depth – úroveň vnoření aktuálního uzlu,
IsEmptyElement – true, je-li prázdný element (např. ),
GetAttribute(atribut) – vrátí hodnotu zadaného atributu aktuálního uzlu,
MoveToFirstAttribute() – přesun na první atribut aktuálního uzlu,
MoveToNextAttribute() – přesun na následující atribut aktuálního uzlu.
Příklad: Napíšeme aplikaci, která načte soubor hraci.xml a jeho obsah vypíše do konzole. Přitom pro lepší přehlednost jednotlivé tagy graficky odsadí.
Načtení XML souboru: XmlTextReader xml = new XmlTextReader("hraci.xml");
xml.WhitespaceHandling = WhitespaceHandling.None;
Průchod XML:
Neodsazujeme na nový řádek všechny uzly – např. Anna chceme celé vypsat na jeden řádek. Proto si musíme pamatovat typ předchozího uzlu (XmlTextReader umožňuje jen dopředné čtení, nemůžeme se vrátit zpět k předchozímu uzlu, abychom se podívali jakého je typu) a podle něj se pak rozhodneme, zda uzel vypíšeme na nový řádek nebo ne.
Vypsání uzlu:
Nejprve zjistíme, zda se uzel má vypsat na nový řádek. Pak uzel zpracujeme podle jeho typu. Otevírací a tagy odsazujeme vždy, uzavírací tagy jen pokud před nimi následuje jiný uzavírací tag.
case XmlNodeType.Text: // text mezi počátečním a koncovým tagem
Console.Write(xml.Value);
break;
case XmlNodeType.CDATA: // <![CDATA[...]]>
Console.Write(odsazeni(xml.Depth) + "<![CDATA["+xml.Value+"]]>");
break;
case XmlNodeType.Comment: // <!-- komentář -->
Console.Write("");
break;
case XmlNodeType.Element: // <element>
Console.Write(odsazeni(xml.Depth));
if (!xml.HasAttributes)
if (xml.IsEmptyElement) // <element/>
Console.Write("<" + xml.Name + "/>");
else
Console.Write("<" + xml.Name + ">");
else
if (xml.IsEmptyElement) // <element atribut="hodnota"/>
Console.Write("<"+xml.Name+" "+vypisAtributy(xml)+"/>");
else
Console.Write("<"+xml.Name+" "+vypisAtributy(xml)+">");
break;
}
Zjištění názvů a hodnot všech atributů aktuálního uzlu:
Pokud je počet atributů 0, vrátíme prázdný string, jinak pomocí MoveToNextAttribute() procházíme atributy.
(c) Systém Jan Sova, Design David Krásenský a Jan Sova Se svými dotazy či problémy se obracejte na diskusní
fórum.
Časopis je součástí projektu Programator