Návrh a tvorba WWW Přednáška 8 PHP IV – Práce s XML SAX, DOM, SimpleXML, …
Opakování XML Extenible Markup Language (rozšiřitelný značkovací jazyk) je značkovací jazyk, který slouží k tvorbě dokumentů s vlastními elementy a atributy, které je možné validovat oproti vlastnímu schématu. Je tedy možné vytvořit de facto vlastní jazyk. XML je zjednodušenou podmnožinu jazyka SGML. První verze jazyka byla publikována v roce 1998.
SAX SAX (Simple API for XML) je rozhraní, které umožňuje procházet XML dokument a to bez potřeby, aby byl celý dokument nahrán do paměti. SAX generuje při nalezení např. počáteční značky, koncové značky či jakéhokoliv jiného prvku v dokumentu událost, prostřednictvím které si příslušnou část XML dokumentu obsloužíme. Vytvoření parseru Nastavení událostí pro parser $parser = xml_parser_create("utf-8"); xml_set_element_handler($parser, "startElement", "endElement"); xml_set_character_data_handler($parser, "characters");
SAX Funkce startElement Otevření spojení se serverem. Funkce endElement function startElement($parser, $name, $attrs) { global $level; foreach ($attrs as $key => $hodnota) { echo $key; echo $hodnota; } $level++; function endElement($parser, $name) { global $level; $level--; echo $level; }
DOM DOM (Document Object Model) je objektový model, který umožňuje procházet HTML a XML dokumenty. DOM načítá veškerá data do paměti a z nich vytváří hierarchický strom. Jeho použití je optimální pouze tam, kde zpracováváme relativně málo dat a kdy k jednotlivým elementům přistupujeme v náhodném pořadí a opakovaně. DOM Level Level 0 – obsahuje vše co předcházelo W3C DOM Level 1 – navigace v DOM dokumentu, manipulace s obsahem Level 2 – podpora jmenných prostorů Level 3 – skládá se z Core, Load and Save, XPath, Views and Formatting, Requirements, Validation
Strom modelu DOM
DOM Vytvoření objektu DOMDocument Načtení XML/HTML souboru Uložení XML/HTML souboru $dom = new DOMDocument(); $dom->load($fileName) $dom->loadXML($string) $dom->loadHTMLFile($fileName) $dom->loadHTML($string) $dom->save($fileName) $s = $dom->saveXML() $dom->saveHTMLFile($fileName) $s = $dom->saveHTML()
DOM dokument I. createAttribute — vytvoří nový atribut createAttributeNS — vytvoří nový atribut se jmenným prostorem createCDATASection — vytvoří nový uzel s CDaty createComment — vytvoří komentář createDocumentFragment — vytvoří nový fragment dokumentu createElement — vytvoří nový element createElementNS — vytvoří nový element se jmenným prostorem createEntityReference — vytvoří novou referenci entity createProcessingInstruction — vytvoří nový PI uzel createTextNode — vytvoří nový textový uzel getElementById — vrátí element přes ID getElementsByTagName — vrátí element přes jméno getElementsByTagNameNS — vrátí element přes jméno se jmenným prostorem importNode — importuje uzel do stávajícího dokumentu load — nahraje XML ze souboru loadHTML — nahraje řetězec HTML loadHTMLFile — nahraje HTML ze souboru loadXML — nahraje řetězec XML
DOM dokument II. normalizeDocument — normalizuje dokument registerNodeClass — registrace vlastní třídy do rozšíření DOM relaxNGValidate — validace dokumentu pomocí relaxNG relaxNGValidateSource — validace dokumentu pomocí relaxNG save — uloží interní XML strom do souboru saveHTML — uloží interní HTML dokument do řetězce saveHTMLFile — uloží interní HTML dokument do souboru saveXML — uloží interní XML strom do řetězce schemaValidate — validace dokumentu pomocí schématu schemaValidateSource — validace dokumentu pomocí schématu validate — validace dokumentu pomocí DTD xinclude — nahradí XIncludes v DOMDocument Object
DOM element getAttribute — vrátí hodnotu atributu getAttributeNode — vrátí atribut uzlu getAttributeNodeNS — vrátí atribut uzle getAttributeNS — vrátí hodnotu atributu getElementsByTagName — vybere element prostřednictvím jména tagu getElementsByTagNameNS — vybere element prostřednictvím jména tagu hasAttribute — zkontroluje, zda atribut existuje hasAttributeNS — zkontroluje, zda atribut existuje removeAttribute — odebere atribut removeAttributeNode — odebere atribut uzlu removeAttributeNS — odebere atribut setAttribute — přidá nový atribut setAttributeNode — přidá nový atribut uzlu setAttributeNodeNS — přidá nový atribut uzlu setAttributeNS — přidá nový atribut setIdAttribute — deklaruje atribut name setIdAttributeNode — deklaruje atribut name uzlu setIdAttributeNS — deklaruje atribut name
DOM uzel appendChild — přidá potomka na konec potomků C14N — kanonizuje (ujednocuje) uzly na řetězec C14NFile — kanonizuje (ujednocuje) uzly na soubor cloneNode — klonuje uzel getLineNo — vrátí číslo řádky pro uzel getNodePath — vrátí XPath pro uzel hasAttributes — kontroluje, zda má uzel atribut hasChildNodes — kontroluje, zda má uzel potomka insertBefore — přidá potomka před referenční uzel isDefaultNamespace — kontroluje, zda určený jmenný prostor výchozím prostorem isSameNode — testuje, zda dva uzly jsou totožné isSupported — testuje, zda je daná vlastnost v dané verzi podporována lookupNamespaceURI — vrátí URI jmenného prostoru prostor na základě prefixu lookupPrefix — vrátí prefix na základě jmenného prostoru normalize — normalizuje uzel removeChild — odebere potomka ze seznamu potomků replaceChild — nahradí potomka
SimpleXML SimpleXML je rozšíření PHP, které umožňuje pracovat s XML dokumenty. Jedná se o další xml parser, který je v PHP5 dostupný. Jeho výhodou je o proti ostatním parserum značná jednoduchost v použití. S obsahem dokumentu XML pracujeme prostřednictvím datových struktur. Základní pravidla SimpleXML: Vlastnosti určují iterátory prvku. Číselné indexy označují prvky. Nečíselné atributy označují atributy. Přístup k textovým datům umožňují řetězové převody.
SimpleXML Funkce SimpleXML Vytvoření SimpleXML objektu vytvoření SimpleXML uzlu z DOM uzlu vytvoření SimpleXML objekt ze souboru vytvoření SimpleXML objekt z řetězce Vytvoření SimpleXML objektu Vrácení správně strukturovaného XML domentu simplexml_import_dom (); simplexml_load_file("test.xml"); simplexml_load_string (); $xml = "<library><item>ISPWE</item></library>"; $sxe = new SimpleXMLElement($xml) $sxe->asXML();
SimpleXML Přidání potomka XML uzlu Přidání atributu k elementu Vrácení potomků uzlu Vrácení atributů elementu Vrácení počtu potomků elementu Spuštění XPath výrazu $company = $sxe->addChild(‘company’); $company->addAttribute(‘id’, ‘10’); $sxe->children(); $sxe->company[0]->attributes(); $sxe->count(); $sxe->xpath('/company');
XPath XPath je jazyk, prostřednictvím kterého lze adresovat určité části XML dokumentu a to pomocí výrazu. Xpath je standardem W3C. XPath výraz se skládá: osy testu uzlu predikátu XPath výraz vrací: logická hodnota (true nebo false) číslo textový řetězec množina uzlů ze stromu vstupního dokumentu část stromu dokumentu
XPath v DOM a SimpleXML DOM SimpleXML evaluate — vyhodnotí XPath výraz a vrátí typ výsledku query — vyhodnotí XPath výraz registerNamespace — registruje jmenný prostor v DOMXPath object registerPhpFunctions — registruje PHP funkci jako XPath funkci SimpleXML query – vyhodnocení XPath výrazu $xpath = new DOMXPath($dom); $title = $xpath->query('//title'); $sxe = new SimpleXMLElement($xml); $sxe->xpath('//title');
Příklad XPath $string = <<<XML <a> <b> <c>text</c> <c>stuff</c> </b> <d> <c>code</c> </d> </a> XML; $xml = new SimpleXMLElement($string); $result = $xml->xpath('/a/b/c'); while(list( , $node) = each($result)) { echo '/a/b/c: ',$node,"\n"; } $result = $xml->xpath('b/c'); echo 'b/c: ',$node,"\n";