Aide - Recherche - Membres - Calendrier
Version complète : Parser un XML en PHP et enregistrer ses nodes
Forum Développeur - Administration serveur, programmation et base de données > Programmation > PHP
Combo
Salut!

Je débute dans la lecture de fichiers XML en PHP et je cherche des exemples simples et fonctionnels.

J'ai 2 XML à enregistrer dans une base et je cherche la doc ou des scripts pour le faire.

Voici mon premier XML :
Code
<?xml version="1.0" encoding="ISO-8859-1"?>
<SELECT>
<OPTION VALUE="">  ------- Indifférent --------  </OPTION>
<OPTION VALUE="7307">Achats</OPTION>
<OPTION VALUE="5620">Aéronautique/Aérospatial - civil et militaire</OPTION>
<OPTION VALUE="9004">Aéroports/Compagnies aériennes</OPTION>
<OPTION VALUE="540">Agriculture/Industrie Forestière/Pêche</OPTION>
<OPTION VALUE="541">Architecture</OPTION>
<OPTION VALUE="556">Armée</OPTION>
<OPTION VALUE="542">Associations/Bénévolat</OPTION>
<OPTION VALUE="45">Assurances</OPTION>
<OPTION VALUE="1">Audit/Comptabilité/Contrôle de gestion</OPTION>
<OPTION VALUE="11">Autres catégories</OPTION>
<OPTION VALUE="576">Banque/Organismes Financiers</OPTION>
<OPTION VALUE="5622">Biens de Consommation</OPTION>
<OPTION VALUE="544">BTP/Construction/Matières Premières/Exploitation Minière</OPTION>
<OPTION VALUE="9008">Chef de projet</OPTION>
<OPTION VALUE="546">Conseil/Consulting</OPTION>
<OPTION VALUE="5623">Edition/Imprimerie</OPTION>
<OPTION VALUE="7305">Electronique</OPTION>
<OPTION VALUE="3">Enseignement/Formation/Universités</OPTION>
<OPTION VALUE="3979">Entretien des bâtiments et espaces verts</OPTION>
<OPTION VALUE="9002">Environnement</OPTION>
<OPTION VALUE="548">Finance/Economie</OPTION>
<OPTION VALUE="8125">Franchise</OPTION>
<OPTION VALUE="9006">Gestion des déchets - Recyclage</OPTION>
<OPTION VALUE="44">Grande distribution/Commerce de gros</OPTION>
<OPTION VALUE="558">Immobilier</OPTION>
<OPTION VALUE="5621">Industrie Automobile/Constructeurs/Equipementiers</OPTION>
<OPTION VALUE="47">Industrie Manufacturière et Production</OPTION>
<OPTION VALUE="5624">Industrie Pétrolière/Pétrochimie</OPTION>
<OPTION VALUE="46">Industrie pharmaceutique/Biotechnologies</OPTION>
<OPTION VALUE="9013">Industrie textile</OPTION>
<OPTION VALUE="9005">Informatique - Services informatiques</OPTION>
<OPTION VALUE="543">Informatique-Hardware/Constructeurs/Editeurs</OPTION>
<OPTION VALUE="6">Informatique-Software/PAO-CAO</OPTION>
<OPTION VALUE="660">Informatique-SSII/Sociétés de conseil</OPTION>
<OPTION VALUE="4">Ingénierie/Conseils en Ingénierie</OPTION>
<OPTION VALUE="553">Installation/Maintenance et Réparation</OPTION>
<OPTION VALUE="554">Internet/Commerce électronique</OPTION>
<OPTION VALUE="7">Juridique</OPTION>
<OPTION VALUE="5625">Logistique/Approvisionnement</OPTION>
<OPTION VALUE="555">Maintien de l'ordre/Sécurité</OPTION>
<OPTION VALUE="9007">Marketing - Chef de produit</OPTION>
<OPTION VALUE="8">Marketing/Communication/Publicité/RP</OPTION>
<OPTION VALUE="12">Media/Divertissements/Arts et Culture</OPTION>
<OPTION VALUE="3561">Postes de direction</OPTION>
<OPTION VALUE="9012">R&D</OPTION>
<OPTION VALUE="547">Recrutement/Intérim et Bureaux de placement</OPTION>
<OPTION VALUE="9010">Responsable des opérations</OPTION>
<OPTION VALUE="5">Ressources Humaines</OPTION>
<OPTION VALUE="13">Restauration</OPTION>
<OPTION VALUE="2947">Santé - Aides Soignants/Auxiliaires de Vie</OPTION>
<OPTION VALUE="551">Santé - Autres</OPTION>
<OPTION VALUE="2963">Santé - Infirmiers diplômés d'Etat</OPTION>
<OPTION VALUE="3975">Santé – Infirmiers Spécialisés/Cadres Infirmiers </OPTION>
<OPTION VALUE="3007">Santé - Informatique/Gestion des données médicales</OPTION>
<OPTION VALUE="3972">Santé - Laboratoires/Services d'analyses médicales</OPTION>
<OPTION VALUE="2990">Santé - Médecins/Chirurgiens/Dentistes</OPTION>
<OPTION VALUE="9014">Santé - Optique</OPTION>
<OPTION VALUE="3973">Santé - Pharmacie</OPTION>
<OPTION VALUE="3974">Santé - Radiologie/Imagerie médicale</OPTION>
<OPTION VALUE="7306">Santé - Services Administratifs et Financiers</OPTION>
<OPTION VALUE="3977">Santé - Services généraux</OPTION>
<OPTION VALUE="557">Santé - Soins et Assistance</OPTION>
<OPTION VALUE="3976">Santé - Visite médicale</OPTION>
<OPTION VALUE="559">Science/Environnement</OPTION>
<OPTION VALUE="2">Services Administratifs</OPTION>
<OPTION VALUE="545">Services Consommateurs/Centre d'Appels</OPTION>
<OPTION VALUE="549">Services Financiers</OPTION>
<OPTION VALUE="550">Services Publics/Collectivités locales</OPTION>
<OPTION VALUE="560">Sports et Loisirs</OPTION>
<OPTION VALUE="561">Télécommunications</OPTION>
<OPTION VALUE="552">Tourisme/Hôtellerie</OPTION>
<OPTION VALUE="562">Transport/Stockage</OPTION>
<OPTION VALUE="5957">Vente à domicile</OPTION>
<OPTION VALUE="9009">Ventes - Service clientèle</OPTION>
<OPTION VALUE="9011">Ventes - Télémarketing</OPTION>
<OPTION VALUE="10">Ventes- Commercial</OPTION>
</SELECT>


J'aimerais enregistrer les valeurs comprises entre les balises OPTION dans une table de ma base de données.

Voici mon second XML :
Code
<cv intitule = "Big Boss" theme = "informatique">
<objectifs>devenir le maitre du monde</objectifs>
   <experiences_professionnelles>
       <experience intitule = "webmaster" date_debut = "01/2000" date_fin = "02/2000">
           <taches>
               <tache>faire des sites oueb</tache>
               <tache>faire le Kfe</tache>
               <!--etc... -->
           </taches>
       </experience>
       <experience intitule = "chef de projet" date_debut = "06/2002" date_fin = "12/2002">
           <taches>
               <tache>crier sur les gens</tache>
               <tache>ramasser l'oseille</tache>
               <!--etc... -->
           </taches>
       </experience>
   </experiences_professionnelles>
   <formations>
       <formation diplome = "Bac STT" etablissement = "l'Initiative" ville = "Paris" annee_obtention = "2000"/>
    <formation diplome = "BTS informatique de gestion" etablissement = "Jules FERRY" ville = "Conflans" annee_obtention = "2003"/>
   </formations>
   <langues>
    <langue intitule = "Anglais" niveau = "intermédiaire"/>
    <langue intitule = "Espagnol" niveau = "scolaire"/>
   </langues>
   <loisirs>
    <loisir>Manger du nutella</loisir>
    <loisir>Bronzer au soleil</loisir>
   </loisirs>
</cv>


Même principe que le premier sauf que là j'ai des boucles à effectuer par nodes.

Merci de votre aide! gourou.gif
Antoine
Quelle version de PHP utilises-tu ?
Combo
J'ai la 4 ou la 5. icon_wink.gif

Je sais qu'en 5 il y a DOMDocument, à priori je m'oriente vers cette solution.
qwix
Avec PHP5 tu peux utiliser simpleXML, c'est vraiment pratique wink.gif
Va voir la doc à ce sujet wink.gif

smile.gif
Combo
Salut Qwix.

Je me suis documenté sur la classe simpleXML de PHP5. Merci pour cette piste car j'ai réussi à lire mon premier XML constitué d'attributs grace à ça.

Cela dit, la lecture du second me pose problème car cette fois-ci, j'arrive à récupérer les noeuds et leur valeurs mais ce sont les attributs qui me pose problème.

Je tente en vain une imbrication de foreach eux-même inclus dans une fonction récursive mais dès que j'essai de récupérer les attributs de chacun de mes noeuds s'ils en possède, je me tape l'erreur suivante : 'Fatal error: Call to a member function attributes() on a non-object in /home/bawdyfes/www/cvflash/scripts/extra/read_posted_cv.php.beta on line 84'.

Voici mon code :
Code
function recurse($child){
   foreach($child->children() as $noeud=>$children){
     echo $noeud.'--'.$children;
     
// récupération des attributs des noeuds (pose problème)      
foreach($noeud->attributes() as $a => $b) {
       if ($a == $noeud) {
         $return = $b;
       }
     }
     if($return) {
       return $return;
     }
 
     echo "<BR>";
     //echo ' who begot a '.$children['cv'];
     recurse($children);
    }
    return;
 }

 foreach($xml->children() as $children) {
   recurse($children, 0);
 }


Merci de m'éclairer à ce sujet, ça m'aiderai beaucoup! gourou.gif
Antoine
ça ne marche que si tu n'affecte pas de clé/valeur icon_confused.gif (je ne sais pas si c'est très clair)

Php
foreach($child->children() as $noeud) {
foreach($noeud->attributes() as $a => $b) {
echo $a.' : '.$b.'<br /> ';
}
}
Combo
Salut Antoine!

J'ai testé ta solution et j'ai toujours une erreur : Fatal error: Call to a member function children() on a non-object in /home/bawdyfes/www/cvflash/scripts/extra/read_posted_cv.php2.beta on line 81.

Voici mon code :
Php
function recurse($child){
foreach($child->children() as $noeud){
echo $noeud.'--'.$children;

// récupération des attributs des noeuds (pose problème)
foreach($noeud->attributes() as $a => $b) {
if ($a == $noeud) {
$return = $b;
}
echo $a.' : '.$b.'<br />';
}
if($return) {
return $return;
}

echo "<BR>";
//echo ' who begot a '.$children['cv'];
recurse($children);
}
return;
}
 
foreach($xml->children() as $children) {
recurse($children, 0);
}


Voici mon XML :
Xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<cv intitule = "Big Boss" dom_activite = "1" theme = "informatique">
<objectifs>devenir le maitre du monde</objectifs>
<experiences_professionnelles>
<experience intitule = "webmaster" date_debut = "01/2000" date_fin = "02/2000">
<taches>
<tache>faire des sites oueb</tache>
<tache>faire le Kfe</tache>
</taches>
</experience>
<experience intitule = "chef de projet" date_debut = "06/2002" date_fin = "12/2002">
<taches>
<tache>crier sur les gens</tache>
<tache>ramasser l'oseille</tache>
</taches>
</experience>
</experiences_professionnelles>
<formations>
<formation diplome = "Bac STT" etablissement = "l'Initiative" ville = "Paris" annee_obtention = "2000"/>
<formation diplome = "BTS informatique de gestion" etablissement = "Jules FERRY" ville = "Conflans" annee_obtention = "2003"/>
</formations>
<langues>
<langue intitule = "Anglais" niveau = "intermédiaire"/>
<langue intitule = "Espagnol" niveau = "scolaire"/>
</langues>
<loisirs>
<loisir>Manger du nutella</loisir>
<loisir>Bronzer au soleil</loisir>
</loisirs>
</cv>


J'espère n'avoir rien oublié...

Merci de ton (votre) aide!
Antoine
Avec mon script ça marche wink.gif

Php
// On ouvre le fichier
$xml = simplexml_load_file("temp.xml");
 
// On lance l'arbre
recursivite($xml);
 
/**
 
Fonction récursive
 
*/

function recursivite($racine, $niveau = 0) {
// Pour chaque item, on récupere le nom et l'objet SimpleXML de la balise
foreach($racine as $nom=>$elem) {
// On vérifie qu'il y a un noeud enfant
if(trim($elem) == "") {
// si oui...
for($i=1;$i<=$niveau;$i++) { echo " "; } // Pour la mise en forme wink.gif
// on affiche le nom
echo "La balise <strong>".$nom."</strong> ";
// on récupere les enfants
$enfants = $elem->children();
// on récupere les attributs s'ils sont présents
$str = "";
$attributs = $elem->attributes();
if(trim($attributs) != "") {
$str = "(";
foreach($attributs as $index=>$contenu) {
$str .= "[<strong>".$index."</strong>] <em>".$contenu."</em>, ";
}
$str = substr($str, 0, -2).")"; // Pour la mise en forme à nouveau
}
echo $str." ";
// comme on a un enfant, on réappelle la fonction (le niveau sert juste à la mise en forme)
recursivite($enfants, $niveau + 1);
} else {
// si on n'a pas d'enfant, on affiche ce qu'il y a dedans wink.gif
for($i=1;$i<=$niveau;$i++) { echo " "; }
echo "La balise <strong>".$nom."</strong> contient <em>".$elem."</em> ";
}
}
}


Code
La balise objectifs contient devenir le maitre du monde
La balise experiences_professionnelles  
 La balise experience ([intitule] webmaster, [date_debut] 01/2000, [date_fin] 02/2000)
   La balise taches  
     La balise tache contient faire des sites oueb
     La balise tache contient faire le Kfe
 La balise experience ([intitule] chef de projet, [date_debut] 06/2002, [date_fin] 12/2002)
   La balise taches  
     La balise tache contient crier sur les gens
     La balise tache contient ramasser l'oseille
 La balise experience  
La balise formations  
 La balise formation ([diplome] Bac STT, [etablissement] l'Initiative, [ville] Paris, [annee_obtention] 2000)
 La balise formation ([diplome] BTS informatique de gestion, [etablissement] Jules FERRY, [ville] Conflans, [annee_obtention] 2003)
La balise langues  
 La balise langue ([intitule] Anglais, [niveau] intermédiaire)
 La balise langue ([intitule] Espagnol, [niveau] scolaire)
La balise loisirs  
 La balise loisir contient Manger du nutella
 La balise loisir contient Bronzer au soleil
fetard
Et en PHP4, il existe une solution?
brudao
Bonjour antoine! je viens trois ans après
j'ai modifié ton code et ça marche sur ma machine mais lorsque je teste sur mon serveur ça ne marche pas.
exemple de mon xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ServeurMySQL Nom="localhost">
<Date DateModif="02-12-2008"/>
<BaseDeDonnee nom='daobruno'>
<Table nom="connectes">
<Champ nom="ip" type="varchar(15)" null="NO" cle="" valeurDefaut="" autoincrementation="NO"/>
<Champ nom="timestamp" type="bigint(8)" null="YES" cle="" valeurDefaut="88" autoincrementation="NO"/>
</Table>
<Table nom="test">
<Champ nom="id" type="int(11)" null="NO" cle="PRI" valeurDefaut="" autoincrementation="YES"/>
<Champ nom="a" type="int(8)" null="YES" cle="" valeurDefaut="8" autoincrementation="NO"/>
<Champ nom="azer" type="varchar(5)" null="NO" cle="" valeurDefaut="a" autoincrementation="NO"/>
<Champ nom="testunique" type="varchar(6)" null="NO" cle="UNI" valeurDefaut="" autoincrementation="NO"/>
<Champ nom="kjh" type="varchar(7)" null="NO" cle="MUL" valeurDefaut="" autoincrementation="NO"/>
</Table>
</BaseDeDonnee>
</ServeurMySQL>

en fait lorsque la fonction croise "/" il arrete de lire le fichier. ici il arretera de lire le fichier a partir de la balise <Date.. />
je ne sais vraimemt pas pourquoi. et pourtant il marche sur moi ma machine
voici le code:
<?php
function lire_fichier_xml()
{
// on charge le fichier xml
$xml = simplexml_load_file("export_my_sql_xml2.xml");
// On appelle la fonction récursive
recursivite($xml);
}

/***************************************/
function recursivite($racine) {
// Pour chaque item, on récupere le nom et l'objet SimpleXML de la balise
foreach($racine as $nom=>$elem) {
// On vérifie qu'il y a un noeud enfant
//echo $racine;
if(trim($elem) == "") {
// si oui...
$enfants = $elem->children();
// on récupere les attributs s'ils sont présents
$attributs = $elem->attributes();
$NomTable=$attributs;
if(trim($attributs) != "")
{
$count=1;
if ($nom=="Table")
{

$GLOBALS['nom_table']=$attributs;
}
foreach($attributs as $index=>$contenu) {
if ($nom=="Table")
{
ajoute_table('localhost','root','','bdtest',$contenu);

}
$description[$count]=$contenu;
$count++;
}
}
if (isset($description[2]) && $description[2]!="")
{
$info_champ = array($description[1],$description[2],$description[3],$description[4],$description[5],$description[6]);
$nom_table_param2=$GLOBALS['nom_table'];
ajoute_champ('localhost','root','','bdtest',$nom_table_param2,$info_champ);
modifie_attribut('localhost','root','','bdtest',$nom_table_param2,$info_champ);
}
// comme on a un enfant, on réappelle la fonction
recursivite($enfants);
}
}
}

?>
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.