Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous!
Je viens à vous parce que vous semblez être mon dernier recours.
En effet, je développe une fonction qui permet de vérifier la validité d'un XML (via un XSD), et ensuite de parser le XML de manière récursive afin de remplir des tables en base de données, tables correspondant à la hiérarchie de mon fichier XML.
Il y a trois types de XML (donc trois XSD), et deux des trois XML sont remplis entièrement dans ma base de données. Le problème se situe donc au niveau du troisième fichier qui ne remplit qu'une partie de ses données.
J'ai regardé au niveau de la mémoire, du temps d'exécution alloué à PHP, ainsi qu'au timeout d'Apache, modifications n'ayant eu aucune répercution sur le script. Peut-être, ai-je manqué ou raté quelque chose?
Le script se termine par une page blanche sans aucune erreur et impossible de savoir d'où cela pourrait venir...
Voici un exemple de la composition type du fichier.xml :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <element_a>value</element_a> <element_b>value</element_b1> <element_c> <element_c_1>value</element_c_1> </element_c> <element_d> <element_d_1> <element_d_11>value</element_d_11> <element_d_12>value</element_d_12> </element_d_1> <element_d_2> <element_d_21>value</element_d_21> <element_d_22>value</element_d_22> </element_d_2> </element_d> </xml>
Et voici mes fonctions PHP :
// fonction qui ouvre le fichier xml reçu en paramètre public function xmlParse($xml) { //on charge notre fichier $parseXml = simplexml_load_file($xml); // on préfixe le nom de la table pour l'insertion des données $this->_table = 'xml_'.$parseXml->getName(); // on attribue notre <root> à _fileXml $this->_fileXml = $parseXml->getName(); // et on parse le xml $this->_recursif($parseXml); } // fonction récursive qui parcourt le fichier xml // et insert les données à la volée en base de données protected function _recursif($xmlObj) { // on parcourt les éléments enfants foreach($xmlObj->children() as $child) { //si on a plus d'enfant, on ajoute en base if(!$this->_hasChildren($child)){ $insert = "INSERT INTO " . $this->_table . '_' . $child->getName() ." (" . implode(', ', array_keys((array) $child)) . ") VALUES ('" . implode("','", (array) $child) . "')"; $this->_em->getConnection()->executeUpdate($insert); if(!empty($this->_parent)){ $this->_table = 'xml_' . $this->_fileXml . '_' . $this->_parent; } else { $this->_table = 'xml_' . $this->_fileXml; } //sinon, on rapelle notre fonction et parse les enfants } else { $this->_parent = $child->getName(); $this->_recursif($child); } } } // fonction qui vérifie si $element a des enfants protected function _hasChildren($element) { $hasChild = false; //on parcourt notre element foreach($element->children() as $child){ $keys = array_keys((array)$child); foreach($keys as $v){ //si notre element est un objet, alors on a un enfant if(!is_numeric($v)){ $hasChild = true; if(empty($this->_parent)){ $this->_table .= '_' . $element->getName(); }else{ $this->_table = 'xml_' . $this->_fileXml . '_' . $element->getName(); } } return $hasChild; } } }
Si vous avez des idées du pourquoi, je suis preneur
Dernière modification par Chim (24-03-2011 18:40:35)
Hors ligne
Pages: 1