15 komentářů k článku PHP a XML: SAX – čteme pěkně popořádku:

  1. Jakub Vrána

    Alternativa

    Jako alternativu doporučuji PHP 5 extenzi XMLReader, která má stejné vlastnosti (postupné načítání) a pracuje se s ní přece jenom o poznání lépe.

    Při tomto způsobu zpracování XML dokumentů (ať už archaickou extenzí XML nebo novější XMLReader) doporučuji udržovat zásobník načtených značek. To je univerzální řešení schopné zpracovat libovolný XML dokument bez potřeby definovat si spoustu pomocných proměnných (zde $in*). Test na titulek RSS zprávy pak může být zapsán jednoduše jako  if ($kontext == array("rss", "channel", "item", "title")).

    Ukázkovému kódu by také myslím slušelo, kdyby místo globálních proměnných používal vlastnosti objektu. Čitelnosti příkladu by to myslím navíc prospělo.

    1. Martin Malý

      Re: Alternativa

      Jakube, je to seriál, takže se dočkáš i XMLReaderu, a to hned příští pondělí (pro zajímavost: Čekají nás ještě díly o XMLReaderu, DOM, XPath a XSLT).

    2. Logik

      Re: Alternativa

      Na druhou stranu by bylo dobré říct, že ten SAX (s dobře napsanejma handlerama) bude to xml zpracovávat značně rychlejc, než todle řešení…
      Vůbec, doufam že na konci bude srovnání, k čemu se hodí co (rychlost, spotřeba paměti, podpora namespace apod…)

      1. Jiří KosekAutor příspěvku

        Re: Alternativa

        SAX tak jak je v PHP se nehodí skoro na nic ;-)

        Nicméně v jazycích Perl a PHP bývá SAX znatelně pomalejší než XMLReader, protože se spoustu času stráví marshallingem předávaných parametrů mezi nativní knihovnou (zde libxml2) a interpretem Perlu/PHP. A stejná aplikace napsaná pomocí SAX vyžaduje obvykle několikánosobně větší počet volání než napsaná pomocí XMLReader.

      2. Jakub Vrána

        Re: Alternativa

        Zajímalo by mě, jestli to máte něčím podložené. Protože já jsem si pro zajímavost udělal srovnání a totožné zpracování 4.9 MB dokumentu ( bawiki.xml) trvalo s extenzí XML 1.04 sekund a s XMLReader 0.55 sekund.

        1. Jiří KosekAutor příspěvku

          Re: Alternativa

          Nějak nechápu, vaše srovnání přece potvrzuje to co jsem psal (SAX je v PHP/Perlu pomalejší než XMLReader), ne?

          A ano, kdysi jsem na to dělal v PHP testy, a o Perlu to vím přímo od autora daných perlových modulů.

          1. Jakub Vrána

            Re: Alternativa

            Však ano, tohle byla reakce na Logika. V názoru se shodneme, já jsem ho pouze podpořil čísly.

              1. Logik

                Re: Alternativa

                Myslel jsem to tak, že v SAXu lze využít možnosti „přehazovat“ handlery a tim v obsluze (při složitějšim dokumentu) zjednodušit rozhodování, zatimco v XML readeru se s uvedenym přístupem se vždy musí porovnávat pole kontextu s hromadou polí „kde právě jsem“.

                Ale je pravda, že jsem se na to koukal teoreticky a přesný čísla neznam (v php jsem se saxem dělal jen malý osubory, kde mě to nezajímalo) – je možný že to maršmelounování parametrů i pro dobře napsanej SAX kód bude pomalejší.

                1. Jiří KosekAutor příspěvku

                  Re: Alternativa

                  I když budete přepínat několik handlerů, bude SAX kód relativně složitější.

                  Navíc s XML Readerem můžete dělat něco podobného. Když najdete určitý element, můžete zavolat nějakou funkci/metodu, předat ji XMLReader a obsloužit celý element a pak se zase vrátit zpět.

    3. Jiří KosekAutor příspěvku

      Re: Alternativa

      I na XMLReader dojde, viz poslední věta článku <i>Příště se podíváme na mnohem pohodlnější alternativu k rozhraní SAX na tzv. XMLReader.</i>

      V knize je samozřejmě i ukázka toho, jak zapouzdřit obsluhu událostí do jednoho objektu, ale nevidím přínos proč objekty v PHP míchat do nejprimtivnějšího příkladu. Narozdíl třeba od Javy nejsou v PHP objekty povinné, není vnucena ani minimální štábní kultura, takže mi přijde zbytečné čtenáře přesvědčovat o tom, zda používat nebo nepoužívat objekty, když jádrem článku mají být možnosti zpracování XML.

      1. Jakub Vrána

        Re: Alternativa

        Omlouvám se, tu větu v článku jsem přehlédl. Navíc mi to mohlo dojít z ukázkových příkladů.

        Co se objektů týče, tak také nejsem žádný jejich fanatický zastánce, ale pokud jejich použití vede ke zjednodušení a hlavně vyčištění kódu jako v tomto případě, tak bych je neváhal použít.

  2. gilhad

    DOM_over_SAX :)

    udelal jsem v Pythonu si mini-knihovnu ktera cte XML pomoci SAX-u a jednoduse zbuduje objektovy model toho XML. Vedlo me k tomu to, ze DOM byl z vykonostniho hlediska naprosto nepouzitelny, jak kvuli rychlosti, tak kvuli pameti. Takhle jsem snadno a rychle ziskal z XML data v pouzitelnem tvaru za prijatelnou cenu, bez komplexnosti sluzeb DOM (kterou jsem fakt nepotreboval).

    Proste se vytvori objekty pro tagy, ktere maji jako polozky text tagu, seznam atributu a seznam potomku. Plus par funkci, ktere vraci hodnoty jako string/int/boolean a umozni pridat/ubrat jednotlive prvky. Pro prenos dat to je vice nez dostacujici, zpracovani je jednoduche a oproti poctivemu DOMu to je radove min narozne na zdroje.

    1. Jakub Vrána

      Re: DOM_over_SAX :)

      Jde tedy o jakousi obdobu knihovny SimpleXML z PHP. Problém tohoto řešení je ten, že se celý dokument načte do paměti, což u obrovských XML dokumentů (třeba export Wikipedie) není schůdné.

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=3098