Le modèle d'objet de doxument (DOM) XML est désormais supporté par le langage PHP à l'aide d'un extension spécifique.

Les fonctions sont disponibles à partir du moment où PHP est configuré avec l'option --with-dom=[répertoire] et si la librairie GNOME xml library est utilisée.

La création d'un objet DOMDocument s'effectue par l'intermédiaire de la fonction xmldoc.

$chaine_XML = '<?xml version="1.0"?>'
                       . '<element_racine>'
                       . '  Texte dans la racine'
                       . '  <noeud_enfant>Contenu textuel</noeud_enfant>'
                       . '  <autre_noeud_enfant attribut="Valeur"/>
                       . '</element_racine>';
$doc_xml = xmldoc($chaine_XML);

Il est également possible de créer un objet DOMDocument à partir d'un fichier externe en utilisant la fonction xmldocfile.

$fichier_xml = "fichier.xml";
$doc_xml = xmldocfile($fichier_xml);

Ensuite, l'extraction d'informations relatives à l'objet DOMDocument peuvent être réalisée par le biais de ses méthodes ou de ses propriétés.

// Obtenir le noeud racine
$noeud_racine = domxml_root($doc_xml);

// Obtenir les noeuds attributs
$attributs = domxml_attributes($doc_xml);

// Obtenir les noeuds enfants
$noeuds_enfants = domxml_children($doc_xml);

// retourne le nom de l'objet DOMDocument
echo $doc_xml->name;

// retourne le type de l'objet DOMDocument
echo $doc_xml->type;

// retourne le contenu textuel de l'objet DOMDocument
$tab_enfants = $doc_xml->children;
echo $tab_enfants[0]->content;

De la même façon, chacune de ces méthodes et propriétés peut être appliquée à chaque noeud extrait du document XML.

for ($i = 0; $i < sizeof($noeuds_enfants); $i++)
{
  $type_noeud = $noeuds_enfants[$i]->type;

  if ($type_noeud == XML_TEXT_NODE)
    echo '<h2>Contenu : ' . $noeuds_enfants[$i]->content . '<br>';
  else
  {
    $noeud = $noeuds_enfants[$j]->children;
    echo '<h2>Nom :' . $noeuds_enfants[$i]->name . '<br>';

    if ($noeud[0]->type == XML_TEXT_NODE)
      echo 'Contenu : ' . $noeud[0]->content . '<br>';
  }
  echo 'Type : ' . $type_noeud . '</h2>';

  if ($type_noeud == XML_ELEMENT_NODE)
  {
    $attributs = domxml_attributes($noeuds_enfants[$i]);
    echo '<h3>Les attributs du noeud ' 
           . $noeuds_enfants[$i]->name . '</h3>';
    for($j = 0; $j < sizeof($attributs); $j++)
    {
      $noeud_texte = $attributs[$j]->children;
      echo 'Nom :' . $attributs[$j]->name . '<br>'
                     . 'Type : ' . $attributs[$j]->type . '<br>'
                     . 'Contenu : ' . $noeud_texte[0]->content . '<br>';
    }
  }
}

La création des documents XML, de ses noeuds et de ses attributs, peut s'accomplir par des fonctions spécialisées.

// Création d'un document XML vide
$doc_xml_vide = domxml_new_xmldoc("1.0");

// Création du noeud racine pour le document XML
$ref_racine = domxml_add_root($doc_xml_vide, "element_racine");

// Création d'un enfant du noeud racine
$ref_enfant = 
         domxml_new_child("element_enfant", "valeur du noeud");

// Création d'un attribut pour le noeud enfant
$ref_attribut = domxml_set_attribute($ref_enfant, 
                                      "nom_attribut", 
                                      "valeur de l'attribut");

La fonction dumpmem permet finalement de créer le document XML dans une chaîne de caractères.

$chaine_XML = domxml_dumpmem($doc_xml_vide);

Cette chaîne de caractères XML pourra être sauvegardée dans un fichier à l'aide des fonctions de système de fichiers ou directement affichée dans le navigateur du client.

// Création d'un fichier en lecture et écriture
$id_fichier = fopen("document.xml", "a+");
rewind($id_fichier);

// Ecriture de la chaîne XML dans le fichier
fwrite($id_fichier, $chaine_XML);

// Affichage du contenu du fichier
echo fread($id_fichier, filesize($id_fichier));

fclose($id_fichier);

Par ailleurs, la fonction xmltree permet de transformer l'arborescence d'un document XML en un tableau PHP.

$tab_xml = xmltree($doc_xml);

Enfin, les expressions XPath sont supportées par le biais de deux fonctions, l'une créant un contexte à partir du document XML et l'autre étant chargée d'évaluer l'expression puis de retourner un tableau de valeurs.

$obj_contexte = xpath_new_context($dom_xml);

$tab_resultat = xpath_eval($obj_contexte);
Sommaire