Ukázka čtení dokumentu

Příklad 6. sax/faktura.php

<?php

// obsluha začátku elementu
function startElement($parser, $name, $attrs)
{
  global $inPolozka, $inCena, $castka, $sazbaDPH;
  
  // zjistíme, zda jsme v nové položce faktury
  if ($name == "polozka")
  {
    $inPolozka = true;
    return;
  }

  // zjistíme, zda jsme v ceně
  if ($name == "cena")
  {
    if (!$inPolozka)
      echo "Chyba: cena není uvedena uvnitř položky!<br>\n";

    $inCena = true;

    // vynulujeme střádač znaků, které tvoří částku
    $castka = "";

    // projdeme všechny atributy
    if (IsSet($attrs["dph"]))
    {
      // zjistíme sazbu DPH
      $sazbaDPH = $attrs["dph"] / 100;
    }
}
}

// zpracování konce elementu
function endElement($parser, $name)
{
  global $inPolozka, $inCena, $castka, $sazbaDPH, $suma, $sumaDPH;
  
  // zjistíme, zda jsme na konci položky faktury
  if ($name == "polozka")
  {
    $inPolozka = false;
    return;
  }

  // zjistíme, zda jsme na konci ceny a v položce
  if ($name=="cena" && $inPolozka)
  {
    $inCena = false;

    // provedeme výpočty
    $suma += $castka;
    $sumaDPH += $sazbaDPH * $castka;
    
    return;
  }
}

// obsluha znakových dat
function characters($parser, $data)
{
  global $inCena, $castka;
  
  // zajímá nás jen text uvnitř elementu cena
  if ($inCena)
    $castka .= $data;
}

$filename  = "../data/faktura.xml";     // jméno zpracovávaného souboru
$inPolozka = false;               // jsme uvnitř položky?
$inCena    = false;               // jsme uvnitř ceny
$castka    = 0;                   // obsah elementu cena
$sazbaDPH  = 0;                   // sazba DPH pro aktuální položku
$suma      = 0;                   // celkový součet
$sumaDPH   = 0;                   // celkový součet DPH

// vytvoření parseru
$parser = xml_parser_create();

// nastavení parametů
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);

// nastavení funkcí pro obsluhu elementů
xml_set_element_handler($parser, "startElement", "endElement");

// nastavení funkce pro obsluhu obsahu elementu
xml_set_character_data_handler($parser, "characters");

// otevření XML dokumentu s fakturou
$fp = fopen($filename, "r");
if (!$fp) die ("Nelze otevřít soubor: $filename.");

// zpracování celého souboru
while ($x = fread($fp, 4096))
{
  if (!xml_parse($parser, $x, feof($fp)))
    die (sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($parser)),
                    xml_get_current_line_number($parser)));
}

// uvolnění paměti alokované parserem
xml_parser_free($parser);

// vypsání výsledku
echo "<pre>\n";
echo "Celkem: " . number_format($suma, 2, ",", ".") . "\n";
echo "DPH:    " . number_format($sumaDPH, 2, ",", ".");
echo "</pre>\n";

?>