Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-03-2011 18:38:11

Chim
Membre
Date d'inscription: 24-12-2008
Messages: 34

Fichier XML avec SimpleXml, soucis de mémoire?

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 :

Code:

<?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 :

Code:

    // 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 smile

Dernière modification par Chim (24-03-2011 18:40:35)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages