Autor Zpráva
Karel+ěš
Profil
Mám dotaz, koukal jsme na http://www.linuxsoft.cz/article.php?id_article=459 všemu rozumím až na jednu věc a to ... kde se vzaly ty hodnoty ve funkci pocatecniZnacka ($nazev, $ atributy), me prijde , že je nikde nepřidělil ?
Rfilip
Profil
Jsou přiděleny xml_parserem vytvořeným řádkem $nas_parser=xml_parser_create();, který volá funkce urcené řádkem xml_set_element_handler ($nas_parser, "PocatecniZnacka", "KoncovaZnacka"); s parametry dle dokumentace k funkci xml-set-element-handler
Karel+ěš
Profil
jojo do dokumentace jsme koukal ... rozumim tomu tak, ze xml_set_element_handler ($nas_parser, "PocatecniZnacka", "KoncovaZnacka") atributy pridelili automaticky znacky k promennym ?

Ted jsem to vyzkousel a když jsme to zaměnil vyšel mi jiný výsledek.
Tak díky.
Rfilip
Profil
Asi jsi dokumentaci nečetl pořádně, 2 parametr tedy "PocatecniZnacka" je jméno funkce která se volá na každem počátečním tagu, 3 parametr tedy "KoncovaZnacka" je jméno funkce která se volá na každém koncovém tagu
juriad
Profil
Ne.
Funkce xml_set_element_handler předá našemu parseru název dvou funkcí. V jiných jazycích by předala přímo ty dvě funkce. $nas_parse si ty funkce uloží a až bude pociťovat, že je to vhodné, tak je zavolá.

Není to žádná magie, následuje hódně ořezaný příklad, jak by parser mohl fungovat:
<?php
class Parser {
  private $funkcePocatek;
  private $funkceKonec;

  function setFunkcePocatek($pocatek) {
    $this->funkcePocatek = $pocatek;
  }

  function setFunkceKonec($konec) {
    $this->funkceKonec = $konec;
  }

  function parse($text) {
    for($i = 0; $i < strlen($text); $i++) { # jde po znacích
      if($text[$i] == '<' && $text[$i+1] != '/') { # je znak < a nenásleduje /
        call_user_func($this->funkcePocatek,$text[$i+1]); # zavolej počátek
      } else if($text[$i] == '/') { # je znak /
        call_user_func($this->funkceKonec,$text[$i+1]); # zavolej konec
      }
    }
  }
}

function createParser() {
  return new Parser();
}

function setHandlers($parser, $pocatek, $konec) {
  $parser->setFunkcePocatek($pocatek);
  $parser->setFunkceKonec($konec);
}

function parse($parser, $text) {
  $parser->parse($text);
}

######

$p = createParser();

function poc($element) {
  echo "zacina element: " . $element . "\n";
}

function kon($element) {
  echo "konci element: " . $element . "\n";
}

setHandlers($p, 'poc', 'kon');

parse($p, '<a><b>ahoj</b><b>nazdar</b></a>');
Karel+ěš
Profil
Rfilip joo cetl, me ze zacatku neslo do hlavy jak se v ty funkci nastavej ty promenny ...fce "PocatecniZnacka" ma napr. promenou $nazev a ja nechapal jak se ji pridelila ta hodnota ...ted uz je mi to jasne.
Diky

Juriad diky za priklad.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: