ProgramatorCZ  |   Diskusní fórum  |   ASMDprojekt  |   Vtipy  |   JavaScript
Spolupracujeme:   WebGuru  |   Komplikátor  |   MinaSite Přidat k oblíbeným položkám  |   Nastavit jako výchozí stránku
Časopis
Hlavní stránka
Assembler
C,C++
Delphi
DOTNET
Flash
HTML
Java
JavaScript
Knihy
O Internetu
Pascal
PHP
Pro. programátor
Programy
Python
Tiskové zprávy

Projekty

JScript Planet
ProProjekty

Služby

Monitoring

Informace
Redakce
O časopisu
Odkazy
Nový redaktor


ISSN 1213-7359

Šéfredaktor:
Jan Sova

Zástupci šéfredaktora
Frerenzy Dawid
Krásenský David

Šéfredaktoři rubrik
Michal Chalupník
Formánek Jiří
Pavel Aleš
Sojka Zdeněk
Petr Rympler

Administrátor
Jan Sova

Naše ikonka
MinaSite
Komplikátorovy Stránky
TOPlist
GALACTICA

Časopis používá redakční systém Sova-Press.



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.

XmlNodeType typPredchozihoUzlu = XmlNodeType.None;
while(xml.Read())
{
   vypisUzel(xml, typPredchozihoUzlu);
   typPredchozihoUzlu = xml.NodeType;
}

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.

novyRadek(xml.NodeType, typPredchozihoUzlu);
switch(xml.NodeType)
{
   case XmlNodeType.XmlDeclaration: // <?xml version="1.0" ?>
      Console.Write("<?" + xml.Name + " " + xml.Value + " ?>");
   break;

   case XmlNodeType.DocumentType:
      Console.Write("<!DOCTYPE " + xml.Name + " ");
      if (xml.MoveToNextAttribute()) // pubid
      {
         Console.Write(xml.Name + " " + "\"" + xml.Value + "\" ");
         if (xml.MoveToNextAttribute()) // sysid
         {
            Console.Write("\"" + xml.Value + "\"");
            if (xml.MoveToNextAttribute()) // subset
               Console.Write("\"" + xml.Value + "\"");
         }
      }
      Console.Write(">");
   break;

   case XmlNodeType.EndElement: //
      if ((typPredchozihoUzlu == XmlNodeType.EndElement) ||
          (typPredchozihoUzlu == XmlNodeType.CDATA))
          Console.Write(odsazeni(xml.Depth) + "</" + xml.Name + ">");
      else
         Console.Write("</" + xml.Name + ">");
   break;

   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.

private String vypisAtributy(XmlTextReader xml)
{
   String sAtributy = "";

   if(xml.AttributeCount > 0)
      while(xml.MoveToNextAttribute())
         sAtributy += xml.Name + "=\"" + xml.Value + "\"" + " ";

   return sAtributy.Trim();
}

Kompletní text zdrojového příkladu si můžete stáhnout zde.

V příštím pokračování se seznámíme s prací s XML pomocí třídy XmlTextWriter.

Autor: Anna Rývová e-mail: anna.ryvova@volny.cz web:

Příspěvky ke článku

Ke článku nejsou komentáře
Přidat komentář

Poslední ze stejné rubriky

Práce s událostmi v .NET Framework.
Práce v .NET Framework - Zástupci
Práce s XML v C# (5.) - ověřování dokumentu pomocí třídy XmlValidatingReader
Práce s XML v C# (4.) - třídy XmlDocument a dotazy jazyka XPath
Práce s XML v C# (3.) - třída XmlTextWriter

Funkce ke článku
Přidat komentář

Nejnovější články
Práce s událostmi v .NET Framework. [18094]
Nová soutěž na 3D Contestu CZ [13683]
Práce v .NET Framework - Zástupci [15997]
Práce s XML v C# (5.) - ověřování dokumentu pomocí třídy XmlValidatingReader [14048]
Práce s XML v C# (4.) - třídy XmlDocument a dotazy jazyka XPath [19471]


O článku
Datum: 25.01.2004
Rubrika: DOTNET
Čtenářů: 14697
Autor: Anna Rývová

Hodnocení článku:
Znamka: 2.81
Počet známek: 2675
[1] [2] [3] [4] [5]

 


(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