Documentation et exemples sur la manipulation de XML en php
Le document XML a une racine, c'est un graphe, comme un document HTML. Dans data.xml
, notre fichier de données d'exemple, la root du document est theme_official_plugins
.
Le DTD est un fichier de documentation pour les données xml. Il peut etre interne au fichier XML mais généralement on le met dans un fichier externe. On le référence depuis le fichier XML qu'il décrit en introduisant cette balise dans le fichier XML
<!DOCTYPE root_element SYSTEM "{fichier.dtd}">
$xml_file = 'data.xml';
$dom = new DOMDocument();
$dom->load($xml_file);
if ($dom->validate()) {
echo "Le document XML " . $xml_file . " est valide." . PHP_EOL;
}
Xpath execute des requetes sur un document XML. Les fonctions built-in de Xpath cherche dans la node SimpleXML une node enfant qui match l'expression XPath.
Exemple avec la node root qui dispose d'un attribut namespace xmlns
, généralement une URI pour assurer l'unicité.
<root xmlns="mon-namespace">
<foo></foo>
</root>
$dom = new DOMDocument();
$dom->load($xml_file);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('ns', 'mon-namespace')
$results = $xpath->evaluate('//ns:root/ns:foo');
Le résultat renvoyé par $xpath->query()
est une DOMNodeList, chaque item de la liste est un DOMNode. DOMElement hérite de DOMNode. Comme on utilise DOMXPath il nous renvoie une DOMNodeList de DOMElement, on peut donc utiliser les méthodes de DOMElement qui sont très completes pour parser les résultats de la requête.
Parcourir la liste avec les itérateurs, plus efficace,
$node = $results->item(0);
if (!isset($node))
return;
do {
echo "name= " . $node->getAttribute('name') . PHP_EOL;
} while ($node = $node->nextSibling);
ou sinon
foreach ($results as $result) {
echo "name= " . $result->getAttribute('name') . PHP_EOL;
}
Exemple de requête
echo "Selectionne le noeud 'theme' dont l'attribut name vaut atelierduboisdor, enfant du noeud courant" . PHP_EOL;
$plugins_list = $xpath->query('//ns:theme_official_plugins/ns:theme[@name="atelierduboisdor"]/ns:plugin');
foreach($plugins_list as $plugin){
echo $plugin->getElementsByTagName('name')->item(0)->nodeValue . PHP_EOL;
echo $plugin->getElementsByTagName('description')->item(0)->nodeValue . PHP_EOL;
}