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.


Personal Tools