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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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