Modérateur PHPfrance |
2575 Messages
29 août 2008, 12:25
Bon, voici un exemple de comment insérer un document xml dans un autre à un emplacement bien défini.
<?php
/*********************************************/
/* INSERTION D'UN DOCUMENT XML DANS UN AUTRE */
/* *******************************************/
//Document de base
$xml1 = '<document>
<chapitre nb="1" titre="titre du chapitre 1">
<section nb="1" titre="titre de la section 1" />
<section nb="2" titre="titre de la section 2" />
</chapitre>
<chapitre nb="2" titre="titre du chapitre 2">
<section nb="1" titre="titre de la section 1" />
<section nb="2" titre="titre de la section 2" />
</chapitre>
</document>';
//Document à insérer
$xml2 = '<data>
<texte>du texte</texte>
<math type="math" nb="1">2+2=4</math>
<texte> du texte encore du texte...</texte>
</data>';
//Chargement des documents XML dans la RAM
$doc1 = domxml_open_mem($xml1);
$doc2 = domxml_open_mem($xml2);
//Obtenir des objets dom
$objDoc1 = $doc1->document_element();
$objDoc2 = $doc2->document_element();
//Accès à un noeud par nom de balise
$doc1_sections = $objDoc1->get_elements_by_tagname("section");
//Recherche et insertion dans un noeud précis
foreach($doc1_sections as $section){
$chapitre_parent = $section->parent_node();
if ($chapitre_parent->get_attribute('nb') == 1 && $section->get_attribute('nb') == 1){ //recherche par attribut
$section->append_child($objDoc2->clone_node(true)); //insertion dans le nœud trouvé par clonage
break;
}
}
//Afficher le résultat sous forme de chaine XML
echo $doc1->dump_mem();
?>
ça marche comme ça:
On a ouvert deux documents XML dans la mémoire, puis on s'est positionné sur un élément du premier document par recherche de la section ayant l'attribut nb="1" qui appartient au nœud du chapitre ayant l'attribut nb="1".
Une fois l'élément trouvé, le deuxième document est inséré à cet emplacement par clonage qui permet de copier les objets du deuxième document vers le nœud positionné du premier document.
NB; Il existe une autre méthode à explorer, celle d'utiliser la méthode "insert_before()" pour insérer des éléments un par un dans le nœud ciblé.
--------
//////----
//---
//----
//////
-------
//---
//----
//---
//----
//---
//
------
//////----
//////-----
//////
-----
||--------
||--
||---
||
Prendre le recul n'est pas une perte de temps.
ps:
Affrontez moi dans l'arène