Skip to main content

PHP a XML (Ukázka, strana 99)

Page 1

98

PHP a XML

úpravy SimpleXML provádět pomocí DOM. Protože jádro kódu spočívá ve využití funkcí rozhraní DOM, nebudeme se nyní zabývat podrobným komentářem příkladu, metody jsou popsány podrobně v kapitole 6. Příklad 4.6: Modifikace dokumentu pomocí SimpleXML – simplexml/modifikace.php <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'> <html lang="cs"> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Ukázka použití XPathu v SimpleXML</title> </head> <body> <?php // načtení dokumentu XML $xml = simplexml_load_file("../data/faktura.xml", "SimpleXMLElement", LIBXML_NOENT|LIBXML_DTDLOAD|LIBXML_DTDATTR); // změníme IČO dodavatele $xml->dodavatel->ico = "123"; // změníme datum splatnosti $xml["splatnost"] = "31.2.2006"; // přidání nové položky vyžaduje využití rozhraní DOM // vytvoříme dočasný DOM document pro nově přidávaný element a jeho obsah $novaPolozka = new DOMDocument(); $novaPolozka->loadXML("<polozka><popis>USB kabel</popis><cena dph='19'>150</► cena></polozka>"); // SimpleXML reprezentaci převedeme na DOM $dom = dom_import_simplexml($xml); // do DOM reprezentace přidáme novou položku $dom->appendChild($dom->ownerDocument->importNode($novaPolozka->documentElement, ► true)); // převedeme DOM zpět na SimpleXML $xml = simplexml_import_dom($dom); // pro ilustraci vypíšeme všechny položky faktury, aby byla vidět změna foreach ($xml->polozka as $polozka) { echo $polozka->popis, "<br>\n"; } // zapíšeme upravený dokument XML do nového souboru file_put_contents("novafaktura.xml", $xml->asXML()); ?> </body> </html>

4. SimpleXML Ukázka elektronické knihy, UID: KOS181202


PHP a XML

99

4.8 Rozšiřování třídy SimpleXMLElement Všechny tři dříve zmíněné funkce pro vytvoření SimpleXML reprezentace dokumentu (simplexml_load_file(), simplexml_load_string() a simplexml_import_dom()) jako druhý nepovinný parametr akceptují název třídy, kterou mají použít pro reprezentaci dokumentu a jeho jednotlivých elementů. Standardně se jedná o třídu SimpleXMLElement. Můžeme si však vytvořit potomka této třídy, který do ní přidá nějaké nové metody, a využívat jej místo standardní třídy. Příklad 4.7 ukazuje jednu z možností využití takového rozšíření. Standardně je možné číst atributy buď jako pole, nebo pomocí iterátoru. Atributy patřící do nějakého jmenného prostoru je pak možné číst pouze pomocí iterátoru. Námi definovaná třída XMLElement je rozšířením standardní třídy SimpleXMLElement a přidává novou metodu attrs(), která umožňuje pohodlné čtení atributů. Např. atribut align u elementu h1 můžeme přečíst pomocí zápisu: $xml->h1->attrs()->align Metodě lze předat i jmenný prostor, ve kterém se atribut nachází. Např.: $xml->element->attrs("http://www.w3.org/1999/xlink")->href Přístup k atributům je tak mnohem jednodušší a přirozenější, než při použití standardních metod. Příklad 4.7: Ukázka rozšíření objektu SimpleXMLElement – simplexml/rozsireni-om.php

// nová třída XMLElement je potomkem SimpleXMLElement class XMLElement extends SimpleXMLElement { // nová metoda, která vrací objekt usnadňující přístup k atributům function attrs() { if (func_num_args() == 0) { // při volání metody bez parametrů je přístup k lokálním atributům return new XMLAttributes(parent::attributes()); } else { // při volání s parametrem je přístup jen k atributům v daném jmenném ► prostoru return new XMLAttributes(parent::attributes(func_get_arg(0))); }

4. SimpleXML

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'> <html lang="cs"> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Ukázka rozšíření třídy SimpleXMLElement</title> </head> <body> <?php

4.8 Rozšiřování třídy SimpleXMLElement Ukázka elektronické knihy, UID: KOS181202


100

PHP a XML

} } // třída reprezentující atributy class XMLAttributes { // soukromá členská proměnná pro dočasné uschování atributů elementu private $attributes; // konstruktor function __construct($attributes) { // převzaté atributy se uloží do členské proměnné $this->attributes = $attributes; } // univerzální metoda, která se volá při přístupu k neznámé vlastnosti/členské ► proměnné function __get($name) { if (isset($this->attributes[$name])) { // jestliže atribut daného jména existuje, vrátíme jeho hodnotu return $this->attributes[$name]; } else { // jinak vrátíme false return false; } } } // ukázka jednoduchého přečtení atributu nepatřícího do jmenného prostoru $xml = simplexml_load_file("../data/faktura.xml", "XMLElement", LIBXML_NOENT|LIBXML_DTDLOAD|LIBXML_DTDATTR); echo $xml->attrs()->splatnost; echo "<br>\n"; // ukázka přečtení atributu patřícího do jmenného prostoru XLink $xml = simplexml_load_file("../data/ns.xml", "XMLElement", LIBXML_NOENT|LIBXML_DTDLOAD|LIBXML_DTDATTR); echo $xml->para->phrase->attrs("http://www.w3.org/1999/xlink")->href; ?> </body> </html> Jak je celá věc implementována? Volání metody attrs() na naší nové třídě vrátí novou instanci pomocného objektu XMLAttributes. Konstruktor této třídy přitom jako parametr dostane pole všech atributů, které nepatří do žádného jmenného prostoru, nebo náleží do

4. SimpleXML Ukázka elektronické knihy, UID: KOS181202


Turn static files into dynamic content formats.

Create a flipbook
PHP a XML (Ukázka, strana 99) by Kosmas-CZ - Issuu