Ruby a XML
IRC bot je přímo předurčen k tomu, že bude zacházet s mnoha daty. V návrhu bArcBota počítam s určitou modularitou výsledného produktu, tedy je pro mě důležité, aby formát uchování dat, byl dobře čitelný pro běžného uživatele.
Návrh dat a požadavky na jejich uložení
Zde je základní návrh dat:
- administrátorem definované příkazy
- uživateli definované reakce
- slovník pojmů
- databáze uživatelů
Všechny tato data musí být přehledně uložena tak, aby šli editovat v běžném textovém editoru. Již tato podmínka vyřazuje použití některého z databázových systémů (PgSQL, MySQL, SQLite, ...). Navíc nechci vázat provoz tak malé aplikace, kterou irc bot je, na velké molochy typu MySQL a PgSQL. Nabízelo by se tedy řešení pomocí např. SQLite. K editaci dat by však byl navíc potřeba další software. Ve výsledku mi tedy zbývají dvě možnosti, navrhnout si vlastní formát uložení dat, nebo použít technologie XML.
Dostupné XML knihovny
Co se týče Ruby a knihoven, tak je na tom podobně jako Perl, tedy výběr široký a záleží jen na vkusu autora, co si vybere. Mě do oka padla knihovna Libxml-Ruby, která poskytuje rozhraní k GNOME Libxml2. Nenechme se zmást názvem, tato knihovna po nás nebude vyžadovat instalaci desktopového prostředí GNOME. Uživatelům operačního systému Debian Linux pak stačí zadat:
$ apt-get install libxml-ruby
Základy práce s Libxml-Ruby
První co většinou potřebujete je čtení XML. Knihovna Libxml k nám k tomu poskytuje velmi užitečné objekty a jejich metody.
# loadnem knihovnu libxml
require 'xml/libxml'
# získáme xml dokument ze souboru
xmlDoc = XML::Document.file('data.xml')
# získáme hlavní uzel dokumentu
xmlRoot = xmlDoc.root
# nyní už můžeme například procházet určité potomky rootu
xmlRoot.find('nodeName').each do |node|
puts node.child.content
end
# nebo vyhledat konkrétní uzel
node = xmlRoot.find('nodeName').to_a.first
Další užitečné metody si už dohledáte v dokumentaci. Čtení dokumentu je velmi intuitivní a pohodlné. Vytváření xml dokumentu pak probíha obdobně:
# vytvoříme novou instanci dokumentu
xmlDoc = XML::Document.new()
# vytvoříme hlavní uzel
xmlDoc.root = XML::Node.new('myRoot')
# ted už můžeme jednoduše přidávat nové elementy a atributy
xmlDoc.root << element = XML::Node.new('element')
elem1['atribut1'] = 'hodnota1'
elem1['atribut2'] = 'hodnota2'
Nedostatky
Jediné co mě nepříjemně překvapilo je pomalost prováděných operací, ale to už bychom od interpretovaného jazyka chtěli moc. V oblasti zaměření, kde se Ruby používá je toto jen nepatrná (skoro zanedbatelná) skvrnka na kráse této knihovny.
Umístění: project » barcbot » ruby_a_xml