LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (136) - XML - DOM a SAX přístupy

Perl Naťukněme stručně několik témat souvisejících s XML. Bude to jen úvod, ze kterého by mělo vycházet další studium.

10.7.2011 00:00 | Jiří Václavík | Články autora | přečteno 6176×

Použití XML::LibXML - reprezentace pomocí DOM

Představme si velmi stručně ještě jeden z nejlepších modulů pro práci s XML, kterým je XML::LibXML od českého autora Petra Pajase. Umí parsovat XML soubory jako DOM. DOM je aplikační rozhraní pro čtení nebo zápis obsahu a struktury XML dokumentů.

Opět budeme pracovat se souborem ukazka.xml.

<?xml version="1.0" encoding="UTF-8"?>
<katalog>
  <kniha id="1">
    <nazev>Stopařův průvodce Galaxií 1.</nazev>
    <autor>Adams Douglas</autor>
    <foto src="stoparuv.jpg" alt="Titulní strana - Stopařův průvodce"/>
    <popis>
      Nezapomeňte: <citace>ručník je dost možná tou nejužitečnější věcí ve vesmíru</citace>.
    </popis>
    <cena>319</cena>
  </kniha>
  <kniha id="2">
    <nazev>Alchymista</nazev>
    <autor>Coelho Paulo</autor>
    <foto src="alchymista.jpg" alt="Titulní strana - Alchymista"/>
    <popis>
      Cesta za pokladem.
    </popis>
    <cena>399.90</cena>
  </kniha>
</katalog>

Následující kód parsuje soubor ukazka.xml a načte data do objektu.

use XML::LibXML;

$parser = XML::LibXML->new;
$d = $parser->parse_file("ukazka.xml");

Pro opětovný výpis dat ve formátu XML nyní budeme volat metodu toString.

print $d->toString(1);

Velmi stručně se podívejme, jak přidávat nové elementy. Budeme k tomu potřebovat odkaz na kořenový element.

$root = $doc->documentElement();

Přidejme nejprve další knihu.

$kniha = $root->addNewChild("", "kniha");

Poté dovnitř můžeme přidat elementy pro autora a název.

$autor = $kniha->addNewChild("", "autor");
$nazev = $kniha->addNewChild("", "nazev");

Do těchto elementů již můžeme vepsat data.

$autor->addChild($doc->createTextNode("Antoine de Saint-Exupéry"));
$nazev->addChild($doc->createTextNode("Malý princ"));

Pro další podobné metody lze nahlédnout do dokumentace.

Modul XML::LibXML je velmi komplexní a umí obrovské množství věcí. Pro zájemce je k dispozici dokumentace.

SAX - postupné zpracování XML dokumentu

Ještě se stručně podívejme, jak lze pracovat s nástrojem SAX. Ten nabízí trochu odlišný přístup na XML dokument. SAX chápe XML jako tok dat a událostí. Každý element vyvolá příslušnou událost a na základě nich postupně můžeme zpracovávat data.

XML::LibXML má SAX rozhraní, avšak je pouze simulované, protože data jsou tak jako tak načteny do paměti. Je třeba se poohlédnout zase po něčem novém. Podívejme se blíže na XML::SAX::ExpatXS.

use XML::SAX::ParserFactory;
use XML::SAX::Writer;

$XML::SAX::ParserPackage = "XML::SAX::ExpatXS";
$parser = XML::SAX::ParserFactory->parser(Handler => XML::SAX::Writer->new);
$parser->parse_file("ukazka.xml") ;

Na programátorovi je určit ke každé události, jak se na ni má reagovat. My jsme v příkladu použili standardní XML::SAX::Writer, který vypíše na výstup XML.

Rozšiřováním XML::SAX::Base pomocí navrhování handlerů můžeme definovat vlastní reagování na události. Funguje to tak, že přetížíme některé z metod, které jsou uvedené v dokumentaci. Zkusme přetížit metodu start_element, která je volána vždy poté, kdy narazíme na první z páru elementů. Můžeme pomocí SUPER zdědit chování nadřízené třídy nebo nějak jinak manipulovat s daty.

package MujHandler;
use Data::Dumper;
use base qw(XML::SAX::Base);

sub start_element {
  my ($self, $data) = @_;
  $self->SUPER::start_element($data);
}

#další metody

1;

Stojí za to se podívat, co vlastně v proměnné $data máme.

print Dumper $data;

Podívejme se orientačně, jak vypadá výstup pro elementy autor a foto.

$VAR1 = {
          'LocalName' => 'autor',
          'Prefix' => '',
          'Attributes' => {},
          'Name' => ${\$VAR1->{'LocalName'}},
          'NamespaceURI' => ${\$VAR1->{'Prefix'}}
        };
$VAR1 = {
          'LocalName' => 'foto',
          'Prefix' => '',
          'Attributes' => {
                            '{}alt' => {
                                       'LocalName' => 'alt',
                                       'Prefix' => ${\$VAR1->{'Prefix'}},
                                       'Value' => "Tituln\x{ed} strana - Stopa\x{159}\x{16f}v pr\x{16f}vodce",
                                       'Name' => ${\$VAR1->{'Attributes'}{'{}alt'}{'LocalName'}},
                                       'NamespaceURI' => ${\$VAR1->{'Prefix'}}
                                     },
                            '{}src' => {
                                       'LocalName' => 'src',
                                       'Prefix' => ${\$VAR1->{'Prefix'}},
                                       'Value' => 'stoparuv.jpg',
                                       'Name' => ${\$VAR1->{'Attributes'}{'{}src'}{'LocalName'}},
                                       'NamespaceURI' => ${\$VAR1->{'Prefix'}}
                                     }
                          },
          'Name' => ${\$VAR1->{'LocalName'}},
          'NamespaceURI' => ${\$VAR1->{'Prefix'}}
        };

Abychom si také ukázali nějaký příklad vlastního handleru, zkusíme vypsat stromový seznam všech otevíracích a uzavíracích elementů.

Jak tedy bude vypadat náš handler? Vytvoříme dvě metody - jednu pro otevírací elementy a druhou pro uzavírací. Z proměnné $data získáme snadno název elementu. Také budeme uchovávat hloubku zanoření.

package MujHandler;
use Data::Dumper;
use base qw(XML::SAX::Base);

our $zanoreni = 0;

sub start_element {
  my ($self, $data) = @_;
  print " " x $zanoreni . $$data{"LocalName"}." - zacatek elementu\n";
  $zanoreni++;
}

sub end_element {
  my ($self, $data) = @_;
  $zanoreni--;
  print " " x $zanoreni . $$data{"LocalName"}." - konec elementu\n";
}

1;

Nyní tento handler použijeme. V úvodním programu nahradíme XML::SAX::Writer za náš MujHandler.

use XML::SAX::ParserFactory;
use MujHandler;

my $handler = MujHandler->new();
$XML::SAX::ParserPackage = "XML::SAX::ExpatXS";
my $parser = XML::SAX::ParserFactory->parser(Handler => $handler);

$parser->parse_uri("ukazka.xml") ;

A výsledek?

katalog - zacatek elementu
 kniha - zacatek elementu
  id - zacatek elementu
  id - konec elementu
  nazev - zacatek elementu
  nazev - konec elementu
  autor - zacatek elementu
  autor - konec elementu
  foto - zacatek elementu
  foto - konec elementu
  popis - zacatek elementu
   citace - zacatek elementu
   citace - konec elementu
  popis - konec elementu
  cena - zacatek elementu
  cena - konec elementu
 kniha - konec elementu
 kniha - zacatek elementu
  id - zacatek elementu
  id - konec elementu
  nazev - zacatek elementu
  nazev - konec elementu
  autor - zacatek elementu
  autor - konec elementu
  foto - zacatek elementu
  foto - konec elementu
  popis - zacatek elementu
  popis - konec elementu
  cena - zacatek elementu
  cena - konec elementu
 kniha - konec elementu
katalog - konec elementu

Nyní si lze snadno představit, jak přizpůsobivý nástroj máme.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

4.1.2017 11:24 / Marcum
extension to house

3.1.2017 10:09 / bolden
country cottages

4.12.2016 22:54 / František Kučera
Dárek

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze