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 :

Récupérer la déclaration de tous NS (xmlns:prefix)


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut Récupérer la déclaration de tous NS (xmlns:prefix)
    Bonjour,

    Contexte: Parseur, DOM / PHP (5.2)

    Demande: Trouver toutes déclarations NS

    Après chargement et traitement d'un DOM je veux l'afficher via un parseur
    personnel mais je perds, alors, les déclarations des NS situés en seconde
    position (sur le même tag). J'ai bien cherché partout mais pas de réponses
    adéquates à la résolution du problème. Le DOM est bien valide, tous
    les préfix/uri existent mais impossible de caler la déclaration du NS à l'endoit
    ou elle était à l'origine. Autrement dit la sortie devient invalide.

    Fonctions testées:

    - getElementsByTagNameNS
    - getAttributeNode
    - getAttributeNS
    - getElementsByTagNameNS

    Entrée dans le DOMDocument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <body>
          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" h="azerty"/>
          <ex:test xmlns:ex="http://www.w3.org/2001/XMLExemple" attr="exemple">
             <ex:t>
                <ex:h1>
                   *** text ***
                </ex:h1>
             </ex:t>
          </ex:test>
          <ouv:livre xmlns:ouv='urn:loc.gov:livres' xmlns:isbn='urn:ISBN:0-395-36341-6'>
             <isbn:k alpha="1"/>
          </ouv:livre>
       </body>
    Sortie parseur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <body>
          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" h="azerty"/>
          <ex:test xmlns:ex="http://www.w3.org/2001/XMLExemple" attr="exemple">
             <ex:t>
                <ex:h1>
                   *** text ***
                </ex:h1>
             </ex:t>
          </ex:test>
          <ouv:livre xmlns:ouv="urn:loc.gov:livres">
             <isbn:k alpha="1"/>
          </ouv:livre>
       </body>
    Inutile de dire que le script est un simple exemple, merci... et merci
    aussi pour vos idées et solutions proposées.

    J'ai, dans un premier temps j'ai résolu à placer la récupération des DECL dans
    le node XML_DODUMENT_NODE mais j'ai abandonné l'idée. Un array qui se balade dans une class (même privat) c'est pas élégant, d'où ma demande.

    Ma fonction primaire:

    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
     
    $allAttrNS = $this -> _domToParse -> getElementsByTagNameNS("*", "*");
     
    if (is_object($allAttrNS))
    {
       for($i=0; $i<$allAttrNS->length; $i++)
       {
          $prefix = $allAttrNS -> item($i) -> prefix;
          $uri = $allAttrNS -> item($i) -> namespaceURI;
     
          if (!array_key_exists($prefix, $this -> _arrayNS) && !is_null($prefix) && $prefix != "")
          {
            $this -> _arrayNS[$prefix] = $allAttrNS -> item($i) -> namespaceURI;
          }   
      }
      print_r($this -> _arrayNS);
    }
    Ce qui donne lors de l'affichage du tableau:

    Array
    (
    [xs] => http://www.w3.org/2001/XMLSchema
    [ex] => http://www.w3.org/2001/XMLExemple
    [ouv] => urn:loc.gov:livres
    [isbn] => urn:ISBN:0-395-36341-6
    )
    Puis, traité par chaque noeud j'obtiens bien le placement des attributs NS mais comme vous le constaté c'est pas très propre... Et bien trop lourd.

    Ce que je souhaite, donc, c'est faire la même chose mais, directement, sur le Node Element. (XML_DOM_ELEMENT). Si quelqu'un a un idée, merci du partage.

    Désolé si c'est encore un peu confus :-)

  2. #2
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Bonjour,

    Je me réponds à moi même...

    Il semble impossible de faire ce que je veux aussi suis-je passé par un autre chemin empruntant de l'idée
    de base et celle soulevée. A ceux que ça intéresse voici la solution que je retiens aujourd'hui:

    * Je n'ai pas indiqué qu'il s'agit d'une itération sur du DOM mais vous l'aurez compris.


    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
     
    case XML_ELEMENT_NODE:
    { 
       if ($this -> _iDepthMax-1 < $this -> _iDepth) break;
     
       $allAttrNS = $this -> _domToParse -> ownerDocument -> getElementsByTagNameNS("*", "*");
     
       if (is_object($allAttrNS))
       {          
          for ($i=0; $i<$allAttrNS -> length; $i++)
          {
             $prefix = $allAttrNS -> item($i) -> prefix;
     
             if ($this -> _domToParse -> getAttribute("xmlns:".$prefix) != "")
             {
                $uri = $this -> _domToParse -> namespaceURI;
                if (!array_key_exists($prefix, $this -> _arrayAttrNS)) $this -> _arrayAttrNS[$prefix] = $uri;
             } 
          }            
       }            
    }
    Inconvénient: Oblige à lancer getElementsByTagNameNS("*", "*") à chaque nouveau noeud

    N'hésitez pas à me dire si cela vous choque, ce que vous en pensé ou même si une autre solution
    vous vient à l'esprit., merci.

    Je ne mets pas en résolu au cas ou...

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    y'a plus simple : ça donne quoi :
    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
    $str = <<<'STR'
    <body>
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" h="azerty"/>
      <ex:test xmlns:ex="http://www.w3.org/2001/XMLExemple" attr="exemple">
         <ex:t>
            <ex:h1>
               *** text ***
            </ex:h1>
         </ex:t>
      </ex:test>
      <ouv:livre xmlns:ouv='urn:loc.gov:livres' xmlns:isbn='urn:ISBN:0-395-36341-6'>
         <isbn:k alpha="1"/>
      </ouv:livre>
    </body>
    STR;
     
    $xml = new SimpleXMLElement($str);
    $ns  = $xml->getNamespaces(true);
    print_r($ns);

  4. #4
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Bonjour,

    Merci pour cette réponse mais je dois décliner: je m'interdit tout hors DOM.

    @+

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par FuZZyLine Voir le message
    je m'interdit tout hors DOM.
    ça veut dire quoi ?

    la librairie SimpleXML est une réduction de DOMDocument.
    Une solution à base DOMXPath ne te conviendrait pas non plus je présume...

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Re,

    Ca veut dire que mon framework est développé exclusivement DOM.
    Que j'achève la view et entame le moteur de template.

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Tu vas dire que je suis attardé mais qu'est ce que ça veut dire "développé exclusivement DOM" ?

    Utilises-tu au moins DOMDocument ? Si la réponse est négative : tu parses ton xml comme une gigantesque string ?

  8. #8
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Pardonne moi mais j'ai du mal à te suivre lol

    Je dis que je gère "tout" en XML (import, load, etc...) et le traitement se fait par DOM, suis-je le seul à développer ainsi? No offense hein, c'est juste que ça m'étonne

  9. #9
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bon, on va pas aller loin à ce rythme !!

    Réponds moi : Utilises-tu la librairie DOMDocument pour gérer tes XML avec PHP ?

  10. #10
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Oui, j'emploie effectivement DOMDocument. L'ai mentionné (de manière informelle) dans mon premier message... et dans le second

  11. #11
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Donc, tu n'as rien contre DOMXPath qui fait partie de DOMDocument ?

  12. #12
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    On tourne en rond lol

    Si j'emploie "DOMDocument" pure c'est que cela m'apparait le choix le plus judicieux en fonction de mon activité sur ce dèv.

    Oh, l'ai aussi mentionné mais le répete: j'itère. (Récursivité...) Je cherche pas un noeud en particulier mais les traite à la volée. Désolé s'il y a eu méprise à ce sujet ce qui peut explique l'incompréhension de part et d'autre

  13. #13
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    A vrai dire, je me demande pourquoi une telle restriction ?
    Si t'as accès à la librairie DOM, j'ai du mal à comprendre pourquoi ne pas l'utiliser à pleine puissance...

  14. #14
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Ce n'est pas parce qu'on a tout à porté de main qu'il faut tout utiliser...
    Puis quel intérêt sur sur-classer DOMDoc quand par ailleurs je peux m'en passer? (des instances qui se
    ballades quand c'est pas la peine j'aime pas)

    Mon seul soucis était porté sur la DECL des attributs NS, Non sur l'approche Dom.

    Crois-tu...:

    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    [
       <!ELEMENT div ANY>
       <!ATTLIST div id ID #REQUIRED>
    ]>
    <html xmlns:tpl="http://www.toto/toto" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
       <head>
          <title><tpl:title/></title>
          <tpl:import file="./site/tokens/intern/meta.html/> 
       </head>
       <body>
          <div id="page">
             <tpl:import file="/site/token/header"/> 
             <div id="mainContainer">
                <tpl:transform file="pages/xsl/content.xsl"/>            
             </div>
             <tpl:import file="/site/token/footer"/> 
          </div>
       </body>
    </html>
    ...qu'avec cet exemple SimpleXML soit super gérable? Je ne crois pas. Ni plus avec Sax ou autres.

    http://fr2.php.net/manual/fr/refs.xml.php De ces class je n'utilise que DOMDoc pour la gestion des
    éléments et XSL pour le rendu Model et c'est tout.

    L'exemple est miteux mais t'auras compris à peu près. Puis DOMDoc étant complexe j'avoue que je
    prends un certain pieds à chercher et trouver.

    Ou je te donne raison c'est qu'il n'y a pas que DOM. J'ai hésité entre DOM et les handler au début mais DOM m'a plus attiré et vala ;-)

    PS: Je crains que nos échanges, bien que cordiaux, ne soulent un brin le forum lol

  15. #15
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par FuZZyLine Voir le message
    Ce n'est pas parce qu'on a tout à porté de main qu'il faut tout utiliser...
    Puis quel intérêt sur sur-classer DOMDoc quand par ailleurs je peux m'en passer? (des instances qui se ballades quand c'est pas la peine j'aime pas)

    Euh je ne comprends vraiment pas du tout ton raisonnement...
    En programmation, il n'y a pas d'instances qui se baladent, tu as des instances parce que tu en as besoin...

    Après, faire un moteur de template basé sur du xslt au sein de PHP c'est comment dire : assez inutile (et très lourd), PHP est déjà nativement un moteur de template...

    Enfin, si c'est un défi personnel alors bon courage pour la suite

    PS: C'est pas étonnant que les librairies standard ne s'en sortent pas avec ton code d'exemple car il est foireux : tu ne devrais pas tout mélanger : dtd et corps de document xml

  16. #16
    Membre habitué
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2008
    Messages : 10
    Par défaut
    Bonjour,

    Citation Envoyé par rawsrc Voir le message
    PS: C'est pas étonnant que les librairies standard ne s'en sortent pas avec ton code d'exemple
    J'ai parlé de cela? Ai-je dis qu'elles ne s'en sortaient pas? n'importe quoi.
    Pour une meilleur compréhension relis et non en biais.

    Citation Envoyé par rawsrc Voir le message
    ...car il est foireux
    From:FuZZyLine "L'exemple est miteux"
    je te l'ai dit. Ravi que tu me donnes raison sur ce point au moins lol

    Étonnant que pour une simple question tu en viennes à vouloir réécrire de A-Z
    quelque chose sur laquelle tu n'as pas la main et qui marche très bien....

    [PS1] : Pour un modo tu trouves pas que tu troll un brin? je mets résolu ça t'évitera du gaspillage de temps en babillant inutilement.

    [PS2] : Quitte à pérorer fais le en MP, merci à toi. Ceci dit sans offense. de ma part ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer la valeurs de tous les ChekeckBox coché
    Par PrinceMaster77 dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2010, 11h56
  2. [MySQL] Récupérer le nom de tous les champs d'une table
    Par cruntett dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/09/2008, 16h18
  3. Récupérer la position de tous les widgets
    Par slash64 dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 01/06/2008, 17h20
  4. [JAXB] XML généré avec tous les xmlns : comment les virer ?
    Par Ougha dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 17/04/2008, 16h27
  5. Réponses: 2
    Dernier message: 31/10/2007, 15h26

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