Přeskočit na obsah

Simple API for XML

Z Wikipedie, otevřené encyklopedie

SAX (Simple API for XML) umožňuje sériový přístup ke XML. Jde o tzv. proudové zpracování, při kterém se dokument rozdělí na jednotlivé jeho části (počáteční a koncové značky, obsahy elementů, komentáře, atd.). Postupně se pak volají jednotlivé události, které ohlašují nalezení konkrétní části. Způsob zpracování těchto jednotlivých událostí je pak již plně v kompetenci programátora.

Tato metoda vypadá na první pohled velice náročně, své uplatnění však má v konkrétních složitějších způsobech zpracování XML, zvláště tam, kde se k dokumentu nepřistupuje náhodně, ale sekvenčně se postupně čte celý obsah. Její další výhoda spočívá v rychlosti zpracovávání a menší paměťové náročnosti. Oproti DOMu bývá několikrát rychlejší, což u větších dokumentů může značně zkrátit čas vykonávání jednotlivých skriptů.

Příklad použití SAXu v PHP

<?php
	// vytvoření nového SAX paresru
	$this->parser = xml_parser_create();
	
	// informace, že při nalezení tagů se májí volat funkce On*Element
	xml_set_element_handler($this->parser, "onStartElement", "onEndElement");
	
	// informace, že při nalezení obsahu elementu se má volat onContent
	xml_set_character_data_handler($this->parser, "onContent");

	// postupné parsování souboru example.xml
	if ($f = fopen("example.xml","r"))
	{
		// postupne nacteni a zpracovani celeho souboru
		while ($xml_data = fread($f,4096))
			if (!$this->parseString($xml_data, feof($f)))
			{
				echo "Chyba parserování!";
			}
		fclose($f);
	}

	// metoda se zavolá při nalezení počátečního tagu
	function onStartElement($parser, $elementName, $attributes)
	{
		echo "nalezen počátečni tag s názvem $elementName: ";
		foreach ($attributes as $nazev => $hodnota)
			echo "atribut $nazev = '$hodnota';\n";
		echo "\n";
	}

	// metoda se zavolá při nalezení koncového tagu
	function onEndElement($parser, $elementName)
	{
		echo "nalezen koncový tag s názvem $elementName: ";
	}
	
	// metoda se zavolá při nalezení obsahu elementu
	function onContent ($parser, $content)
	{
		echo "obsah elementu: $content\n";
	}
?>