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 7210×

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ů

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

7.5.2018 16:20 /František Kučera
Na stránkách spolku OpenAlt vyšla fotoreportáž Pražské srazy 2017 dokumentující srazy za uplynulý rok. Květnový pražský sraz na téma audio se bude konat 17. 5. 2018 (místo a čas ještě upřesníme).
Přidat komentář

17.4.2018 0:46 /František Kučera
Dubnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 4. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tématem tohoto srazu bude OpenStreetMap (OSM) aneb svobodné mapy.
Přidat komentář

16.3.2018 22:01 /František Kučera
Kulatý OpenAlt sraz v Praze oslavíme klasicky: u limonády a piva! Přijďte si posedět, dát si dobré jídlo a vybrat z mnoha piv do restaurace Kulový blesk, který najdete v centru Prahy nedaleko metra I. P. Pavlova na adrese Sokolská 13, Praha 2. Sraz se koná ve čtvrtek 22. března a začínáme v 18:00. Heslo: OpenAlt. Vezměte s sebou svoje hračky! Uvítáme, když si s sebou na sraz vezmete svoje oblíbené hračky. Jestli máte nějaký drobný projekt postavený na Arduinu, nějakou zajímavou elektronickou součástku, či třeba i pěkný úlovek z crowdfundingové akce, neváhejte. Oslníte ostatní a o zábavu bude postaráno.
Přidat komentář

13.2.2018 0:41 /František Kučera
Únorový pražský sraz OpenAltu se koná 15. 2. 2018 a tentokrát se vydáme na návštěvu do jednoho pražského datacentra. Sejdeme se v 17:50 v severovýchodní části nástupiště tramvajové zastávky Koh-I-Noor. Po exkurzi se přesuneme do restaurace U Pštrosa (Moskevská 49), kde probereme tradiční témata (svobodný software a hardware, DIY, CNC, SDR, 3D tisk…) a tentokrát bude k vidění i IoT brána od The Things Network.
Přidat komentář

11.2.2018 23:11 /Petr Ježek
Hledáte lehký a rychlý prolížeč PDF souborů? Pokud vás již omrzelo čekat na načítání stránek či jiné nešvary, zkuste xreader.
Přidat komentář

11.2.2018 20:35 /Redakce Linuxsoft.cz
Třetí ročník odborné IT konference na téma Cloud computing v praxi proběhne ve čtvrtek 1. března 2018 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 16 hod. odpoledne. Konference o trendech v oblasti cloud computingu nabídne i informace o konkrétních možnostech využívání cloudů a řešení vybraných otázek souvisejících s provozem IT infrastruktury.
Přidat komentář

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

> Poslední diskuze

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

15.1.2018 17:26 / Mira Harvalik
Re: Jak udělat HTML/Javascript swiping gallery do mobilu?

30.12.2017 20:16 / Michal Knoll
odmocnina

Více ...

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