Salut les gens,

Apache : Apache 2.0
PHP : Version 5.2.6

Sur un projet j'utilise la class DOM et parmi l'une des applications se trouve un parser mais la déclaration des namespaces me posent un soucis.

Malgré diverses recherches je ne trouve pas réponse à ce problème.

Existe t-il une fonction équivalente à celle se trouvant dans simpleXML qui est getDocNamespaces?

Au pire, si ce n'est pas le cas, y a t'il une "astuce", un algo qui permetrait de la simuler avec DOM? A savoir, bien que j'ai intégré la fonction je trouve
ridicule "dans DOM" de devoir utiliser simpleXML... Ce me semble parfaitement idiot et illisible sachant que tout le script, lui, est écrit avec la class DOM.
En gros c'est inélégant pour ne pas dire "moche".

Mon besoin:

- Lecture de toutes déclarations et quelles soient ou non normalisée.
- Que ce soit réalisé avec DOM
- Ne pas utiliser $dom -> saveXML

Fonction dans laquelle cette fonction devra se trouver:

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
/**
 * Retourne la déclaration du ou des namespaces pour le noeud en cours
 *
 * @access : public
 * @value  : [string] Vide ou nom du namespace si besoin
 * @return : string   Chaine concaténée key/value ou vide 
 */     
 public function getNamespaceDECL($mixedNamespace = "*")
 {
   /**
    * Si l'argument est invalide on sort
    */
    if (!is_string($mixedNamespace)) trigger_error(ErrorDisplayDom::ERR_ARG_STRING, E_USER_ERROR);
 
   /**
    * Si la variable de class n'est pas valable on sort
    *
    * NOTA : la variable _domNode est référencée dans la class
    * NOTA : précision sans doute inutile mais bon...
    */
    if (!$this -> _domNode instanceof DOMNode) trigger_error(ErrorDisplayDom::ERR_INS_UNVALID, E_USER_ERROR);
 
   /**
    * Récupération du noeud en cours
    *
    * @var instance
    */
    $domNode = $this -> _domNode;
 
   /**
    * Chaine à retourner
    *
    * @var string
    */
    $script = "";
 
   /**
    * Chaine des attributs résultants
    *
    * @var string
    */
    $strAttr = "";
 
   /**
    * Création de l'oblet Simple XML
    *
    * @var string
    */
    $simple = simpleXML_import_dom($domNode);
 
   /**
    * Si l'argument demande tous les namespace on poursuit
    */
    if ($mixedNamespace == "*")
    { 
      /**
       * Tableau résultat
       *
       * @var array
       */
       $arraySimpleXml = $simple -> getDocNamespaces(true);
 
      /**
       * Détruit l'objet Simple XML
       */
       unset($simple);
 
      /**
       * Boucle sur les éléments du tableau en ne prenant que la clef
       */
       while(list($strKey) = each($arraySimpleXml))
       {     
        /**
         * Si la clef est vide on la traite ainsi
         */
         $strKey = "xmlns" . (($strKey == "") ? $strKey = "" : ":".$strKey);
 
        /**
         * Lance la fonction de récupération
         *
         * @var string 
         */
         $resAttr = $domNode -> getAttribute($strKey);   
 
        /** 
         * Si la chaine n'est pas vide on assigne sa valeur
         */ 
         if ($resAttr != "") $strAttr .= " ".$strKey."=\"".$resAttr."\"";
       }
    }
 
   /**
    * Au contraire l'appel se fait sur un nommé
    */     
    else
    {
      /**
       * Prépare de la déclaration
       */
       $strNamespace = "xmlns:".$mixedNamespace;
 
      /**
       * Lance la fonction de récupération
       *
       * @var string 
       */
       $resAttr = $domNode -> getAttribute($strNamespace);                
 
      /** 
       * Si la chaine n'est pas vide on assigne sa valeur
       */ 
       if ($resAttr != "") $strAttr .= " ".$$strNamespace."=\"".$resAttr."\"";
    }
 
   /**
    * Assignation des valeurs
    */ 
    $script = $strAttr;
 
   /**
    * Retourne la chaine formée
    */
    return $script;
 }
Voici à partir d'un exemple bourré de Decl NS ce que j'obtiens: (il va de soit que ce n'est qu'un exemple bidon que je ne saurais, bien entendu, utiliser en production)

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
 
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.global.com" xmlns:tpl="http://www.tpl.com" lang="fr" xml:lang="fr">
   <head tpl:id="TOTO" id="primaire">
      <tpl:title alpha="one">
         The_title
      </tpl:title>
      <meta name="description" content="tree sur xml" />
   </head>
   <body xmlns="http://www.global.com" mlns:oups="http://www.oups.com">
      <div>
         <![CDATA[Un message accentu&eactue; avec un e accent aïgu (é).]]>
      </div>
      <?php $exemple = "Azerty"; echo $exemple; ?>
      <div>
         <p>
            <hr xmlns="http://www.last.fr" xmlns:tst="http://www.last.fr" />
            un paraph
            <span xmlns:bis="http://www.bis.fr">un span</span>
         </p>
      </div>
      <span><a href="www.com.com">Bonjo<br />ur...!</a></span>
      <tpl:exemple tpl:ATTR="Bidule" />
      <span><span><span>Au revoir...!</span></span></span>
   </body>
</html>
Comme constaté la fonction marche mais, même répondant à la problématique des déclarations des NS, la manière dont elle y répond ne me
satisfait pas. Y a t'il quelqu'un qui saurait m'aiguiller sur une autre façon de faire... plus élégante?

J'ai tenté d'être clair et le plus complet qui soit dans ma demande si vous souhaitez plus d'information n'hésitez pas je répondrais autant que possible.

Merci, si ce n'est pour une réponse en tout cas pour avoir eu la patience de tout lire

@+ les gens