Forum Clubic

Le meilleur parser XML selon vous - Discussion sur les parsers XML

Bonjour,

Il y a quelques temps j’ai voulu faire un programme qui utilisait le format de fichier XML pour enregistrer des données. Beaucoups de personnes disent que le XML est le format de l’avenir alors j’ai voulu tester des parseurs XML.
En faisant une petite recherche je me suis apperçu que ce format était très peux utilisé avec le C++ (mais beaucoups plus avec le .net ou le java, ce qui est normal, ces-derniers sont orientés web). Il y a donc peu de code d’exemple mais une tonne de documentation (la plupart du temps indigeste)

En cherchant un peu j’ai trouvé deux parseurs XML (qui marche avec le C++)

  • MSXML (version 1 à 4)
  • Xerce XML (fait par la fondation Apache)D’après vous, quel est le meilleur (avantage/incévnient) ? Lequel utilisez vous?

Je vous dis tout de suite, je ne suis pas une bête en programmation avec XML. J’ai juste fait un petit programme avec Xerce XML pour afficher un fichier XML dans un logiciel.

J’ai essayé de faire un tableau des avantages des deux parseurs trouvé. (je vous dis tout de suite, je ne suis pas une bête en XML. J’ai juste fait un petit analyseur XML avec Xerce XML et j’ai lu la doc de MSXML)

MSXML (version 1-2-3-4) (télécharger version 4 (avec documentation))

Avantages

  • Fait par Microsoft (marque de fabrique?)
  • Intégré à Windows (sur tous?) (sous XP: version 1 - 2 - 3)
  • Composant COM. (mais pourquoi toujours COM? :-(. Ca me parait plus lourd que un API simple, je me trompe?)
  • Documentation classe et bien faiteXerce XML (site officiel)
  • Fait par la fondation Apache (un vrai avantage)
  • J’ai entendu dire que ça supporte mieux le standard… (je ne sais pas si c’est des rumeurs)Voilà d’après ce que j’ai vu. Mais bien sûre je ne suis pas un expert. Alors j’aurais bien voulu avoir des échos de votre part.

Je dirais Xerces car portable (multiplateforme). Maintenant je ne fais pas de C++, mais plus Java/C/PHP et hormi le C, les deux autres langages proposent déjà un parser XML (lib expat, je pense).

En Java, j’utilise le parser SAX: c’est assez manuel, on lit les tags à la volée, mais je trouve que c’est efficace. Par contre, on n’a pas l’arbre DOM chargé en RAM (avec ma façon de coder): un désavantage pour faire des manipulations complexes, un avantage quand les fichiers sont gros.
Sinon, Xerces aussi.

Je suis en train de tester MSXML (faire un programme pour l’exportation de base de données via ODBC vers XML). Mais les librairies COM me paraissent lourdent à mettre en place (comparé à Xerces qui est à la fois complet et plus facile à mettre en place).

Disons que si tu utilises COM faut mieux utiliser les classes ATL qui automatisent bien des tâches assez répétitives en tirant parti du C++. (cherche du côté de CComPtr & co)

Ce composant ne possède pas d’interface dans un logiciel. C’est donc moins lourd à mettre en place qu’un simple composant ActiveX.
Je n’aime pas utiliser les libs toutes faite (je fais de la prog comme un loisire).
Sinon la lib ATL est inclue par défaut dans Windows ou pas? Il faut l’ajouter à l’installation d’un programme?

ATL c’est juste une séries de template donc (en général) pas besoin de libraries. C’est inclus avec Visual C++.

Oui mais il existe une Dll nan? ATL.dll? ATL71.dll?
Elles servent à quoi ces Dll alors…

quelques fonctions font partis de la DLL en effet mais ce sont des cas particuliers.

Si tu te limite à utiliser CComPtr pour encapsuler tes pointeurs IUnknown, à priori tu devrait pas avoir besoin de DLL au pire tu peux compiler en statique.

Avec PHP, il y a moyen de faire des trucs pas mal pour ceux que ca interresse d’utiliser le XML.
J’avai creé un menu en xml qui était appellé par une multitude de pages
Bien sure ca reste un parseur assez basique qui ne gere pas les attributs dans les balises, mais bon ca peut servir quand même!

require("config.php");
/////////////////////////////////////////////////////////////////////
//
// Module    : SimpleXMLParser.php
// DateTime  : 26/07/2005 11:32
// Author    : Phillip J. Whillier
// Purpose  : Very lightwieght "simple" XML parser does not support attributes.
//
/////////////////////////////////////////////////////////////////////

class SimpleXMLParser {
  
   // Find the max number of specific nodes in the XML
   function MaxElements($XMLSource, $XMLName) {
           $MaxElements = 0;
           $XMLTag = "<" . $XMLName . ">";
           $Y = $this->instr($XMLSource, $XMLTag);
           while($Y>=0) {
                   $MaxElements = $MaxElements + 1;
                   $Y = $this->instr($XMLSource, $XMLTag, $Y + strlen($XMLTag));
           }
       return $MaxElements;
   }
  
   // Parse xml to retrieve a specific element
   // Instance number is a zero based index.
   function Parse($XMLSource, $XMLName, $aInstance = 0, $Default = "") {
           $XMLLength = strlen($XMLSource);
           $XMLTag = "<" . $XMLName . ">";
           $XMLTagEnd = "</" . $XMLName . ">";
           $Instance = $aInstance + 1;
      
       /* Find the start of the requested instance... */
           $XMLStart = 0;
  
           for($x = 1; $x < $Instance + 1; $x++) {
                   $Y = $this->instr($XMLSource, $XMLTag, $XMLStart);
  
                   if ($Y >= $XMLStart) {
                           $XMLStart = $Y + strlen($XMLTag);
                   }
                   else {
                           return $Default;
                   }
           }
      
       /* Find the end of the instance... */
           $XMLEnd = $XMLStart;
           $XMLMatch = 1;
  
           while($XMLMatch) {
                   $c = substr($XMLSource, $XMLEnd, strlen($XMLTagEnd));
                   if($c == $XMLTagEnd) {
                           $XMLMatch = $XMLMatch - 1;
                   }
                   else {
                       if (substr('c', 0, 1) == $XMLTag) {
                           $XMLMatch = $XMLMatch + 1;
                       }
                   }
                   $XMLEnd = $XMLEnd + 1;
                   if ($XMLEnd == $XMLLength) {
                           return $Dufault;
                   }
           }
           return substr($XMLSource, $XMLStart, $XMLEnd - $XMLStart - 1);
   }
  
   // Helper function for finding substrings
   function instr($haystack, $needle, $pos = 0) {
       $thispos = strpos($haystack, $needle, $pos);
       if ($thispos===false)
           $thispos = -1;
       return $thispos;
   }
}
/////////////////////////////////////////////////////////////////////
// Création des menus pour le projets (Feeder_Fan)
/////////////////////////////////////////////////////////////////////
function xml_menu($in) {

  $xmlObj = new SimpleXMLParser;
  
  $file = $in;
  if (!($fp = fopen($file, "r"))) {
       die("unable to open XML");
   }
  $myxml = fread($fp, filesize($file));
   fclose($fp);
  
   $xml = $xmlObj->Parse($myxml, "menu");
  
  //nombre d'attributs  
   $maxName = $xmlObj->MaxElements($xml, "item");
  
  for ($i=0;$i<$maxName;$i++) {
  if ($i == 0) {
  $url= $xmlObj->Parse($xml, "url", $i);
  $titre = $xmlObj->Parse($xml, "titre", $i);
  echo "<a href=\"$url\"><span style=\"color: red;\">$titre</span></a>";
  }
  else {
  $url= $xmlObj->Parse($xml, "url", $i);
  $titre = $xmlObj->Parse($xml, "titre", $i);
  echo "<a href=\"$url\">$titre</a>";
  }
  }
}