SimpleXML: jmenné prostory
Extenzi SimpleXML mám v oblibě pro velice jednoduchou práci s XML dokumenty. Konec konců jsem se jí nechal inspirovat při tvorbě NotORM. Např. pro získání hodnoty atributu <meta charset>
se dá použít jednoduché $html->meta["charset"]
. Pro složitější dotazy se dá použít XPath, např. všechny tabulky v dokumentu pomocí $html->xpath("//table")
.
Když dokument obsahuje jmenné prostory, tak je práce složitější a část magie mizí. Mějme takovýto dokument:
<movies xmlns="http://default" xmlns:a="http://a">
<movie xml:id="movie1" a:link="IMDB">
<a:actor>Onlivia Actora</a:actor>
</movie>
</movies>
Dá se s ním pracovat takhle:
<?php $movies = simplexml_load_string($file); // Namespace http://www.w3.org/XML/1998/namespace is available as "xml". echo $movies->movie->attributes("xml", true)["id"] . "\n"; // Namespaced attributes can be accessed with attributes(). echo $movies->movie->attributes("a", true)["link"] . "\n"; // Using namespace URI allows document to use any namespace alias. echo $movies->movie->attributes("http://a")["link"] . "\n"; // Children can be accessed with children(). echo $movies->movie->children("http://a")->actor . "\n"; // Using xpath() with namespace requires registering it first. $movies->registerXPathNamespace("a", "http://a"); echo count($movies->xpath("//a:actor")) . "\n"; // Even the default namespace must be registered. $movies->registerXPathNamespace("default", "http://default"); echo count($movies->xpath("//default:movie")) . "\n"; ?>
Vložit komentář

