IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comparer deux fichiers XML - un local et un externe


Sujet :

Langage PHP

  1. #1
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut Comparer deux fichiers XML - un local et un externe
    mmm Tant qu'on est dans le sujet, j'ai fais un petit script pour la comparaison de fichier xml.
    Cette comparaison analyse juste un numéro de version afin de savoir si la version utilisé est bel et bien identique à celle du logiciel.
    Le fichier propre est installé à la racine de l'hébergement, l'autre sur un serveur maitre tierce.
    Le fais de lire le fichier xml local et le comparer avec une version externe retourne un beau nombre de question sur la sécurité et surtout quel méthode est optimiser.
    J'ai testé avec simple_xml + file get content et j'ai également testé xmlreader + file get content mais j'ai une erreur de lecture sur le fichier distant.
    Quel méthode est la plus adapté au fichier xml distant.
    Le fichier xml est hyper simpliste
    ps: je veux bien posté les codes testé

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Il aurait mieux valu créer un nouveau sujet.

    En ce qui concerne :
    • les performances : tout dépend du contenu du fichier, de sa taille et s'il contient d'autres données ou non qu'on est aussi amené à utiliser ou non. Parce que ce ne sont pas les solutions qui manquent : XML (avec toutes les API possibles) ou non, simple lecture voir regex, ... Certaines permettant une lecture partielle de la ressource, d'autres non. Si le fichier est petit, elles doivent toutes se valoir sinon il suffit de faire le test (ce sera l'accès réseau le plus long).
    • la sécurité : en quoi est-ce un problème s'il ne contient que des informations de versions ou des informations non sensibles et qu'il est en lecture seule ? Si c'est vraiment gênant, en ce qui concerne sa consultation, il y a l'authentification HTTP pour commencer ou des protocoles plus adaptés (HTTPS, FTP).
      Quant au fait qu'il s'agit de données externes (corruption possible de cette source), tout dépend si on les réutilise et à quelles fins (eval ou similaire, sql, affichage, ...).

  3. #3
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    merci d'avoir créer le sujet,
    En gros mon code ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    private function read_local_version(){
    		try {
    			$xml = simplexml_load_file(self::load_local_file());
    			$v = $xml->number;
    		} catch(Exception $e) {}
    		return $v;
    	}
    	private function read_local_phase(){
    		try {
    			$xml = simplexml_load_file(self::load_local_file());
    			$v = $xml->phase;
    		} catch(Exception $e) {}
    		return $v;
    	}
    private function compare_version(){
    		try {
    		$file = file_get_contents('http://www.sitedistant.com/version.xml');
    		//$file = fopen('http://www.sitedistant.com/version.xml', "r");
    		if(!$file){
    			$compare = '
    			Serveur indisponible';
    			return exit();
    		}else{
    			//$xml = simplexml_load_string($file);
    			$xml = simplexml_load_file('http://www.sitedistant.com/version.xml');
    			$magixv = $xml->number;
    			$localv = self::read_local_version();
    			if($localv <= $magixv){
    					$compare = 'Une nouvelle version est disponible';
    				}elseif($localv >= $magixv){
    					$compare = '
    							Vous utilisez la dernière version';
    				}else{
    					$compare = 'Vous utilisez la dernière version';
    				}
    			}
    		} catch(Exception $e) {}
    		return $compare;
    	}
    C'est la version avec simple xml, j'ai des résultat inattendu, par exemple j'étais en panne d'internet donc plus accès à la version distante (j'etais en local) et ma version local ne pouvant plus lire le fichier sur le serveur devais en principe me retourner "serveur indisponible", il n'en étais rien.
    Sans parler qu'il ne lit pas correctement le fichier distant pourtant c'est le même.
    Voila le fichier XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8" ?>
    <version>
    	<number>2.0.0</number>
    	<phase>Alpha</phase>
    </version>
    Très court donc en principe la lecture est facile.
    J'ai également au tout début tester avec XMLREADER:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    protected static function readInstance() {
    		if(is_null(self::$readInstance)) {
    			self::$readInstance = new XMLReader();
    		}
    		return self::$readInstance;
    	}
    	protected function read_local_version(){
    			$xml = self::readInstance();
    			$xml->open(magixcjquery_html_helpersHtml::getUrl().'/version.xml', "UTF-8");
    			while($xml->read()){
    				if ($xml->hasValue){
    				   return $xml->value;
    				}
    			}
    			$xml->close();
    	}
    	protected function compare_version(){
    		$urimagix = file_get_contents('http://www.monsitedistant.com/version');
    		if($urimagix){
    			$file = $urimagix;
    			if(self::read_local_version() == $file){
    				$compare = 'Vous utilisez la dernière version';
    			}elseif(self::read_local_version() >= $file){
    				$compare = 'Vous utilisez la dernière version';
    			}elseif(self::read_local_version() < $file){
    				$compare = 'Une nouvelle version est disponible';
    			}
    		}
    		return $compare;
    	}
    Une idée sur le probléme de lecture ?
    Dans le deuxième cas avec XMLREADER je n'arrivais pas à lire le fichier du tout (le distant), j'ai alors fais un simple fichier contenant le numéro de version et comme on peu le constater sa fonctionne.
    Mais si je lit un fichier XML distant plus rien
    Je m'y prend probablement comme un manche

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Euh, il faudrait déjà ne pas confondre erreur/exception et bien lire la documentation des fonctions qu'on utilise ! Où avez-vous vu que les fonctions simplexml_load_[file|string] levaient une exception ?
    Citation Envoyé par la documentation
    Si une erreur survient, la fonction retournera FALSE.
    Donc tester leurs valeurs de retour avant de chercher à les utiliser. Forcément, ça va planter, sinon (enfin, peut, c'est du PHP).

    Seul le constructeur de SimpleXMLElement lève une exception si le document ne peut être parsé.

    Par ailleurs, exception ou pas, dans les deux cas vos méthodes renvoient ou renverraient une valeur NULL :
    • Erreur non gérée :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      function bigbadoum() {
          try {
              $sxml = simplexml_load_file('http://www.bibadoum.zzt/jexistepas.xml');
              $v = $sxml->number;
          } catch (Exception $e) {} # Ne sera jamais exécuté
          return $v;
      }
       
      var_dump(bigbadoum());
      NULL puisqu'on tente d'accéder à une propriété d'un non objet (FALSE).
    • Exception mal gérée (à moins que le code soit incomplet) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      function bigbadoum() {
          try {
              $sxml = new SimpleXMLElement('http://www.bibadoum.zzt/jexistepas.xml', 0, TRUE);
              $v = $sxml->number;
          } catch (Exception $e) {}
          return $v;
      }
       
      var_dump(bigbadoum());
      NULL, on retourne la valeur d'une variable qui n'a pas été définie (puisque de l'appel au constructeur on saute dans le catch avant de passer au return).

    D'où le comportement inattendu, j'imagine. A noter, que dans les deux cas, PHP génère une erreur de type notice quand même.


    Pour XMLReader, vous retournez sans doute la mise en forme de votre fichier XML située sous votre élément racine (votre indentation).

  5. #5
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Avec ceci sa fonctionne déjà mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    private function load_local_file(){
    		return magixcjquery_html_helpersHtml::getUrl().'/version.xml';
    	}
    	private function read_local_version(){
    		try {
    			$xml = new SimpleXMLElement(self::load_local_file(),0, TRUE);
    			$v = $xml->number;
    		} catch(Exception $e) {
    		$log = magixcjquery_error_log::getLog();
    	        $log->logfile = $_SERVER['DOCUMENT_ROOT'].'/error.log';
    	        $log->write('An error has occured :'. $e->getMessage(),__FILE__, $e->getLine());
    	        magixcjquery_debug_magixfire::magixFireError($e);
    		}
    		return $v;
    	}
    	private function read_local_phase(){
    		try {
    			$xml = new SimpleXMLElement(self::load_local_file(),0, TRUE);
    			$v = $xml->phase;
    		} catch(Exception $e) {
    			$log = magixcjquery_error_log::getLog();
    	         $log->logfile = $_SERVER['DOCUMENT_ROOT'].'/error.log';
    	        $log->write('An error has occured :'. $e->getMessage(),__FILE__, $e->getLine());
    	        magixcjquery_debug_magixfire::magixFireError($e);
    		}
    		return $v;
    	}
    	private function compare_version(){
    		try {
    		$file = fopen('http://www.monsite.com/version.xml', "r");
    		if(!$file){
    			$compare = 'Serveur indisponible';
    			return exit();
    		}else{
    			$xml = new SimpleXMLElement('http://www.monsite.com/version.xml',0, TRUE);
    			$magixv = $xml->number;
    			$localv = self::read_local_version();
    				if(strcmp($localv , $magixv)){
    						$compare = '
    										Une nouvelle version est disponible';
    				}else{
    					$compare = 'Vous utilisez la dernière version';
    				}
    			}
    		} catch(Exception $e) {
    			$log = magixcjquery_error_log::getLog();
    	        $log->logfile = $_SERVER['DOCUMENT_ROOT'].'/error.log';
    	        $log->write('An error has occured :'. $e->getMessage(),__FILE__, $e->getLine());
    	        magixcjquery_debug_magixfire::magixFireError($e);
    		}
    		return $compare;
    	}
    Je dois faire des testes avec XMLREADER pour voir mais qu'entendez-vous par
    vous retournez sans doute la mise en forme de votre fichier XML située sous votre élément racine
    J'ai pas encore pris mon café

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Si vous faites un var_dump de ce que vous retourne votre méthode à base de XMLReader vous obtenez quoi ?

    Logiquement vous retournez, la partie entre [ ] :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8" ?>
    <version>[
    	]<number>2.0.0</number>
    	<phase>Alpha</phase>
    </version>
    Il faut ajouter l'option LIBXML_NOBLANKS lors du open et/ou revoir votre méthode de parsing.

    [Votre classe SimpleXML based aurait bien besoin de refactoring. Est-ce normal qu'il y ait des méthodes qui ne soient pas déclarées static ?]

  7. #7
    Membre confirmé Avatar de gtraxx
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 043
    Points : 570
    Points
    570
    Par défaut
    Mon code doit être nettoyé , pour ce qui est des méthodes non déclaré en static c'est une erreur de ma part un nettoyage s'impose.
    Je dois faire un bon nettoyage du code afin qu'il sois parfaitement optimisé et surtout lisible pour les personnes qui passent après moi
    Je vais voir pour xml reader mais bon sa fonctionne avec simple xml
    merci en tout cas

Discussions similaires

  1. Outils sur les différences entre deux fichiers XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 19
    Dernier message: 21/07/2008, 15h21
  2. outils pour comparer deux fichiers xml
    Par donny dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/03/2008, 20h06
  3. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19
  4. [XML] Convertir fichier XLS en deux fichiers XML
    Par Kornoman dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 31/03/2006, 15h30
  5. Fonction c qui compare deux fichiers ???
    Par babyface dans le forum C
    Réponses: 4
    Dernier message: 19/11/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo