Capitales – mini-projet

Toujours afin de tester de nouvelles technologies et de m’exercer avec le framework Symfony2 et les librairies javascript pour mobile, j’ai décidé de faire un mini-projet qui liste les pays du monde et leurs capitales. Le résultat final se trouve ici.

Après avoir chercher une base de données qui comprend les pays et leurs capitales, j’ai finalement décider d’utiliser Wikipedia et parser le html. Je voulais pouvoir refaire l’import si nécessaire. Donc il me fallait le faire programmatiquement, en utilisant PHP.

Notes

  • Même si la table HTML de Wikipedia semble uniforme, il m’a fallu traiter les différences de DOM
  • Utilisation de SplFileObject au lieu de fread: Utiliser les classes de la Standard PHP Librairy, c’est louable. Mais comment lire le fichier d' »une shot », l’équivalent de:
    contents = fread($handle, filesize($filename));
  • J’ai essayé d’utiliser la classe Crawler de Symfony2, normelement utilisée pour les tests fonctionnelles: cette classes n’est pas fait pour parser du XML, même si j’ai bien aimé la classe qui convertit un selecteur css en selecteur XPath.
  • En utilisant DOMDocument: mmm, trop « verbose », pas facile de parcourir le document je trouve, les attributs nodeValue et textContent retourne le contenu « strippé », donc il faut utiliser la méthode saveXML() uniquement utilisable depuis DOMDocument, donc si on a un DOMNode, il faut faire un
    $myDOMNode->ownerDocumnent->saveXML($myDOMNode);

    Pas très élégant, non?

  • Donc retour à SimpleXML, mais la méthode XPath de SimpleXML semble très limité (peut-être à cause des namespace ou du fait que ce soit du html?). Donc l’essentiel est en SimpleXML, mais j’ai du utilisé la méthode DocDocument::getElementById() et convertir en SimpleXMLElement en utilisant la fonction simplexml_import_dom.
  • Plus d’info sur les limitations que j’ai rencontré avec la méthode SimpleXMLElement::xpath() (mais c’est peut-être juste moi):
    • incapable de loader le html… Peut-être est-ce à cause des namespaces?
    • incapable d’utiliser les selector XPath de type attribut:
      root/node[@id='my-id']
  • Quelques problème d’encoding avec DomDocument: il a fallu qu’en loadant le string XML, j’ajoute le « tag » xml  
    $domDoc->loadHTML('<?xml encoding="UTF-8">' . $content);

Aussi, j’ai toujours une des problèmes de performance avec jQuery, lorsque le DOM est trop important…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *