Staňte se programátorem: Napište si vlastní adresář

Dneska si napíšeme jednoduchý adresář kontaktů, který se z principu nebude lišit od toho, který používá třeba Outlook Express. Zároveň se seznámíme se zpracováváním XML dokumentu.

V dnešním článku si vytvoříme jednoduchý adresář, který bude obsahovat seznam našich kontaktů s jejich osobními údaji (přezdívka, telefonní číslo, bydliště, fotografie apod.). Jednotlivé kontakty budeme moci organizovat do jednoduchých skupin (práce, rodina, přátelé aj.) a celý adresář pak bude uložený v XML souboru, který je dle mnohých pro svou jednoduchou a přirozenou stromovou strukturu standardem budoucnosti pro ukládání dat. XML souborem je třeba HTML stránka, RSS zdroj, ale i některé kancelářské formáty včetně OpenDocument standardu z OpenOffice.org kancelářského balíku a nového Office OpenXML, tedy vylepšeného formátu kancelářského balíku Microsoft Office 2007. 

Práce s XML z pohledu programátora nepatřila v minulosti k těm nejjednodušším úkonům, my vám však ukážeme, že se XML bát nemusíte a pokud si osvojíte základní principy XML parseru, zjistíte, že se s XML dokumenty pracuje v každém z programovacích jazyků prakticky totožně.

adresar1.png  xml_struktura.png
Uživatelské rozhraní našeho adresáře kontaktů a struktura XML souboru

Pro práci s XML souborem použijeme třídu System.Xml.XmlDocument, která nečte jednotlivé XML tagy ze souboru, ale načte celý soubor do paměti, kde k němu pomocí metod této třídy můžeme přistupovat. Čtení a zápis do paměti je zároveň mnohem rychlejší než do souboru na pevném disku. Jakmile XML dokument v paměti dle chuti zpracujeme, opět ho přeneseme na disk. V hantýrce programátorů jsme vlastně použili čtení a zápis přes buffer.

Schéma XML souboru

Každý XML dokument musí povinně obsahovat jeden hlavní kořenový uzel, v našem případě to bude uzel s názvem „kontakty“, který obsahuje poduzly s názvem „skupina“. Každý tento poduzel bude mít jeden atribut představující název této skupiny. V jednotlivých skupinách pak budou uloženy poduzly s jednotlivými kontakty. Jejich název bude jak jinak „kontakt“ s povinným atributem „nick“, tedy přezdívkou člověka, jehož údaje budou v tomto uzlu uloženy. Podobný XML dokument by mohl vypadat například takto:

<?xml version="1.0" encoding="unicode"?>
  <kontakty>
   
<skupina nazev="Přátelé">
      <kontakt nick="Pája">
      <pozn>V pátek zajít na večeři</pozn>
     
<jmeno>Pavel Marčík</jmeno>
      <tel>737430123</tel>
      <icq>333327652</icq>
      <adresa>Dvořákova 343, Písek</adresa>
      <obr>C:\obrazky\pavel17.jpg</obr>
    </kontakt>
  </skupina>
</kontakty>

Načtení XML dokumentu v C#

Jak jsem již nastínil v úvodu, pro práci s XML dokumentem budeme používat třídu System.Xml.XmlDocument, která XML načte ze souboru a uloží jej do paměti. K načtení XML dokumentu použijeme metodu Load. K uložení pak metodu Save.

XmlDocument doc = new XmlDocument();
doc.Load(@“C:\kontakty.xml“);

Manipulace s uzly a elementy XML dokumentu

Pro výběr konkrétního poduzlu XML dokumentu nám poslouží metoda SelectSingleNode, která jako argument očekává výraz jazyka XPath což je je dotazovací jazyk, pomocí kterého lze adresovat části XML dokumentu. S XPath lze z XML dokumentu vybírat jednotlivé elementy a pracovat s jejich hodnotami a atributy. Více o tomto jazyce najdete na webových stránkách www.zvon.org. Metoda SelectSingleNode vrací instanci třídy XmlNode představující určitý element XML dokumentu.

string xpath = "//kontakty//skupina[@nazev='{0}']";
// Vybere uzel skupiny do kterého chceme nový kontakt uložit
XmlNode node = doc.SelectSingleNode(string.Format(xpath,skupina));

Pro vytvoření nového poduzlu použijeme metodu CreateElement třídy XmlDocument, kde je nutné jako argument dosadit název nového poduzlu. Daný poduzel následně přiřadíme k jeho rodičovskému uzlu pomocí metody AppendChild:

// Vytvoří nový uzel (element) představující
XmlElement kontakt = doc.CreateElement("kontakt");

// Přiřadí ke skupině nový kontakt
node.AppendChild(kontakt);

Pro vytvoření nového atributu uzlu použijeme ten samý postup s tím rozdílem, že budeme pracovat s třídou XmlAttribute:

// Vytvoří nový atribut
XmlAttribute atr = doc.CreateAttribute("nick");

// atributu přiřadí název přezdívky nového kontaktu
atr.InnerText = novyKontakt;

// přiřadí k elementu atribut
kontakt.Attributes.Append(atr);

Pro nastavení vnitřní hodnoty uzlu použijeme vlastnost InnerText:

XmlNode nod = doc.SelectSingleNode(“//....“);
nod.InnerText = “Nějaká hodnota“;

Pro odstranění určitého poduzlu použijeme metodu RemoveChild třídy XmlNode. Tato metoda očekává jako argument instanci třídy XmlNode představující hledaný poduzel. Například chceme-li z kořenového uzlu (kontakty) odstranit poduzel s názvem skupina, jehož hodnota atributu „nazev“ je „Přátelé“, zavoláme tuto metodu:

// Vybere odstraňovaný uzel představující konkrétní skupinu
XmlNode odstrNod = doc.SelectSingleNode("//skupina[@nazev='Přátelé']"));

// Z kořenového uzlu odstraní konkrétního potomka (vybraný uzel)
doc.DocumentElement.RemoveChild(odstrNod);

Nevoní vám XML? Příště vyzkoušíme SQL databázi

A to je vlastně všechno. Dnes jsme si tedy popsali základní rutiny pro manipulaci s XML dokumentem a jeho stromovou strukturou. Jak příklad jsme si napsali jednoduchý adresář. Pokud byste jej rozšířili, klidně se může srovnávat třeba s adresářem kontaktů programu Outlook Express. Pokud vám tedy není programovaní cizí, můžete náš adresář rozšířit, poslat nám jej na tento e-mail a my vaši verzi zveřejníme v některém z příštích článků.

Pokud jste ale přesto nepřišli XML na chuť, vydržte do příštího týdne, stejný program si totiž napíšeme s pomocí SQL databáze, se kterou umí Microsoft .NET pracovat na jedničku.

Nakonec nesmí chybět ani slíbený spustitelný program a projekt. K prvnímu budete potřebovat nainstalovaný novější Microsoft .NET Framework, pakliže si budete chtít projekt upravit a sestavit, budete potřebovat bezplatné vývojové prostředíMicrosoft Visual C# 2008 Express Edition.

Diskuze (20) Další článek: Titulní stránka nového Computeru

Témata článku: , , , , , , , , , , , , , , , , , , ,