Aller au contenu

PHP, XML et attribs...


Sujets conseillés

Posté

Bonsoir,

enfin, je viens de comprendre (et donc de me mettre) au fameux couple XML-PHP.

J'ai donc créée (dans l'immédiat - histoire de m'y exercer) une class PHP pour parser du XML !

J'aurais 2 questions, svp :

-1- dans ma fichier xml, j'ai comme attribut sur certaines balises 'xml:lang' pour la déclaration correspondante...

Hors, quand je cherche à récupérer la valeur de mon tableau $attribs["XML:LANG"], j'ai une valeur vide retournée ! Alors qu'elle est affectée... dans mon fichier xml.

Cette valeur ne peut-être lue parce qu'elle correspond à une déclaration xml native ?

-2- dans mon fichier xml, j'ai un élément title dont le but (évident !) est de correspondre à l'élément title de la future page html !...

Pour l'instant, le temps de mon test, histoire de vérifier que mon parser fonctionne, je le laisse tourner ainsi... mais mon désir est de pouvoir capturer cet élément pour le déclarer autrement, à part... pourriez-vous m'aiguiller et me donner une idée de comment le réaliser ?

(certainement à retourner dans une function que je pourrais appeler aprés... !?)

Le fichier xml : http://dev.stephane-huc.net/test/Ad-Myre_project.xml

Quant à ma class PHP :

<?php
class parser_xml {
   var $abbr;
   var $parser;
   var $owner;
   var $file;
   var $link;
   var $elementStarter;
   var $elementEnder;
   
   function parser_xml($file) {
       $this->verif_file($file);
       
       $this->elementStarter = array (
           "DOC" =>    "<div id=\"project\">",
           "NAME" =>   "<h2",
           "TITLE" =>  "<title>",
           "P" =>      "<p>",
           "BOLD" =>   "<strong>",
           "ABBR" =>   "<acronym",
           "CHAPTER" =>        "<h3>",
           "LIST" =>   "<ul>",
           "ITEM" =>   "<li>",
           "DEFINITION" =>     "<dl>",
           "DEFTITLE" =>      "<dt>",
           "DEFITEM"=>        "<dd>",
           "IT" =>     "<em>",
           "LINK" =>   "<a",
           "BR" =>     "<br",
       );
       
       $this->elementEnder = array (
           "DOC" =>    "</div>",
           "NAME" =>   "</h2>",
           "TITLE" =>  "</title>",
           "P" =>      "</p>",
           "BOLD" =>   "</strong>",
           "ABBR" =>   "</acronym>",
           "CHAPTER" =>        "</h3>",
           "LIST" =>   "</ul>",
           "ITEM" =>   "</li>",
           "DEFINITION" =>     "</dl>",
           "DEFTITLE" =>      "</dt>",
           "DEFITEM"=>        "</dd>",
           "IT" =>     "</em>",
           "LINK" =>   "</a>",
           "BR" =>     " />",
       );
   }
   
   function verif_file($file) {
       $this->owner = fileOwner("index.php");
       
       if(file_exists($file) && is_file($file) && is_readable($file)
           && (fileOwner($file) == $this->owner))
           $this->file = $file;
   }
   
   function first_element($parser, $name, $attribs) {
       
       if($name == "NAME") {
           $this->name = $this->elementStarter[$name];
           
           if(!empty($attribs["ID"])) {
               $this->name .= " id=\"";
               $this->name .= $attribs["ID"];
               $this->name .= "\"><a name=\"";
               $this->name .= $attribs["ID"];
               $this->name .= "\"></a";
           }
           
           $this->name .= ">";
           
           echo $this->name;
       }
       elseif($name == "LINK") {
           $this->link = $this->elementStarter[$name];
           $this->link .= " hreflang=\"";
           $this->link .= $attribs["XML:LANG"];
           $this->link .= "\" href=\"";
           $this->link .= $attribs["XLINK:HREF"];
           $this->link .= "\" title=\"";
           $this->link .= $attribs["XLINK:TITLE"];
           $this->link .= "\"";
           $this->link .= ">";
           
           echo $this->link;
       }
       elseif( $name == "ABBR") {
           $this->abbr = $this->elementStarter[$name];
           $this->abbr .= " lang=\"";
           $this->abbr .= $attribs["XML:LANG"];
           $this->abbr .= "\" title=\"";
           $this->abbr .= $attribs["DEF"];
           $this->abbr .= "\"";
           $this->abbr .= ">";
           
           echo $this->abbr;
       }
       else echo $this->elementStarter[$name];
   }
   
   function end_element($parser, $name) {

echo $this->elementEnder[$name];
   }
   
   function display_text($parser, $data) {
echo $data;
   }
   
   function manager_smart($parser, $cible, $data) {
       switch (strtolower($cible)){
case "php":
           eval($data);
           break;
       }
   }
   
   function manager_ref_ext($parser, $openEntityNames, $base, $systemId, $publicId) {
       if (!empty($systemId)) {
           if (!$analyze = new parser_xml($systemId)) {
               printf("Could'nt to open the element %s not at %s\n", $openEntityNames, $systemId);
 return false;
           }

           $analyze->parser();
           return true;
       }
   }
   
   function parser() {
       $this->parser = xml_parser_create_ns();
       xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, true);
       xml_set_object($this->parser, &$this);
       xml_set_element_handler($this->parser, "first_element", "end_element");
       xml_set_character_data_handler($this->parser, "display_text");
       xml_set_processing_instruction_handler($this->parser, "manager_smart");
       xml_set_external_entity_ref_handler($this->parser, "manager_ref_ext");

       if (!($fp = _AT_fopen($this->file, "r"))) die("Could'nt to open this XML $file");
       
       while ($data = fread($fp, 4096)) {
           if ( !xml_parse( $this->parser, $data, feof($fp) ) ) {
               die( sprintf( "Error XML %s at the line: %d\n\n",
                   xml_error_string(xml_get_error_code( $this->parser ) ),
                   xml_get_current_line_number( $this->parser) ) );
           }
       }
       fclose($fp);
       
       xml_parser_free($this->parser);
   }
}
?>

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...