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

Bibliothèques et frameworks PHP Discussion :

[DOM] recuperer une donnée xpath


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut [DOM] recuperer une donnée xpath
    Bonjour,

    je souhaiterais adapté un program vbs qui analyse un ficher xml via xpath avec php mais je bute sur le vocabulaire php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             <xmpDM:duration xmpDM:scale="1/1000" xmpDM:value="4639300"/>
    j'ai tapé ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     'declaration des  Namespace
     
    $xpath_str = '/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:duration';
     
    $elements = $xpath->evaluate($xpath_str);
    et je souhaite atteindre la valeur de xmpDM:value soit : 4639300

    en vbs on utilise duration.getAttribute("xmpDM:value")

    mais en php ?




    autre noeud (je met direct le code vbs):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    xmlDoc.selectNodes("/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:Tracks/rdf:Bag/rdf:li/rdf:Description[@xmpDM:trackType='TableOfContents']/xmpDM:markers/rdf:Seq")
     
    Set enfants = personneElement.selectNodes("rdf:li/rdf:Description")
     
    For Each enfantElement In enfants
    timing=enfantElement.getAttribute("xmpDM:startTime")

    la partie xml :

    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
           <rdf:Description xmpDM:trackType="TableOfContents" xmpDM:frameRate="f1000" xmpDM:trackName="Table of Contents">
                                <xmpDM:markers>
                                    <rdf:Seq>
                                        <rdf:li>
                                            <rdf:Description xmpDM:name="  1. Marker 1" xmpDM:startTime="0" tscDM:image="S2_Thumbnails.png" tscDM:imageindex="0" tscDM:imageoffset="0" tscDM:imagerect="0, 0, 75, 42" />
                                        </rdf:li>
                                        <rdf:li>
                                            <rdf:Description xmpDM:name="  2. Marker 2" xmpDM:startTime="237760" tscDM:image="S2_Thumbnails.png" tscDM:imageindex="1" tscDM:imageoffset="0" tscDM:imagerect="75, 0, 75, 42" />
                                        </rdf:li>
                                        <rdf:li>
                                            <rdf:Description xmpDM:name="  3. Marker 3" xmpDM:startTime="394620" tscDM:image="S2_Thumbnails.png" tscDM:imageindex="2" tscDM:imageoffset="0" tscDM:imagerect="150, 0, 75, 42" />
                                        </rdf:li>
                                        <rdf:li>
                                            <rdf:Description xmpDM:name="  4. Marker 4" xmpDM:startTime="589360" tscDM:image="S2_Thumbnails.png" tscDM:imageindex="3" tscDM:imageoffset="0" tscDM:imagerect="225, 0, 75, 42" />
                                        </rdf:li>
                                        <rdf:li>
                                            <rdf:Description xmpDM:name="  5. Marker 5" xmpDM:startTime="672700" tscDM:image="S2_Thumbnails.png" tscDM:imageindex="4" tscDM:imageoffset="0" tscDM:imagerect="300, 0, 75, 42" />
                                        </rdf:li>




    en version php ?


    en vous remerciant,

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut
    j'ai trouvé une piste pour le premier element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $xpath_str = '/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:duration';
     
    $elements = $xpath->evaluate($xpath_str);
     
    if (!is_null($elements)) {
          echo $elements[0]->getAttribute('xmpDM:value')."<br>";
          }

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il faut savoir le namespace-uri correspondant au préfixe xmpDM : ça, on peut lire directement du document xml. Supposons qu'on a une déclaration là :
    xmlns:xmpDM="http://blah"
    On peut donc faire sortir l'attribut comme ça.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $elements = $xpath->evaluate($xpath_str);
    foreach($elements as $elem) {
        echo $elem->getAttributeNS('http://blah', 'value')."<br />";
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 173
    Points : 88
    Points
    88
    Par défaut
    je me suis débrouillé comme ça :

    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
     
     
     
    $xpath_str = "/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:Tracks/rdf:Bag/rdf:li/rdf:Description[@xmpDM:trackType='TableOfContents']/xmpDM:markers/rdf:Seq";
    $elements = $xpath->evaluate($xpath_str);
     
    Foreach($elements as $nodes){
     
    	Foreach($nodes->childNodes as $parent){
    		if($parent->nodeName=='rdf:li'){
    			Foreach($parent->childNodes as $key => $node){
     
    				if($node->nodeName=='rdf:Description'){
    					print($node->getAttribute('xmpDM:startTime')."<br>");
    				}
    			}
    		}
    	}
    }

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je voudrais faire quelques notes en espérant que ça peut être utile.
    [0] D'abord une remarque mineur: on peut écrire Foreach() si on veut, mais ce n'est pas trop d'idiosyncrasie de php - on écrit plus que souvent comme foreach(). Mais chacun à son style ... comme la sensitivité de cas ne s'applique pas au mots clés et constructs comme foreach.
    [1] Maintenant c'est plus de substance. Si le code montré est conçu comme un débouillage, ça s'implique qu'on est prêt à l'améliorer. Je trouve qu'il y a raison de le faire réécrire. Je dirais xpath est plus que capable de faire sortir directement l'attribut désiré apparemment.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        //$xpath_str = "/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:Tracks/rdf:Bag/rdf:li/rdf:Description[@xmpDM:trackType='TableOfContents']/xmpDM:markers/rdf:Seq";
        $xpath_str = "/x:xmpmeta/rdf:RDF/rdf:Description/xmpDM:Tracks/rdf:Bag/rdf:li/rdf:Description[@xmpDM:trackType='TableOfContents']/xmpDM:markers/rdf:Seq/rdf:li/rdf:Description/@xmlDM:startTime";
     
        $results=$xpath->evaluate($xpath_str);
        foreach ($results as $result) {
            print($result."<br />");
        }
    [2] Je suspecte que vous n'avez pas faire une façon ou une autre enregistrer namespaces avec le moteur de xpath par la fonction registerNamespace(). Il faut y regarder de plus près. Il ne faut pas faire le code rigidement dépendant des préfixes utilisés dans le document xml. Ce n'est pas souhaitable, c'est même fortement déconseillé. C'est la même raison que je utilise getAttributeNS() au lieu de getAttribute() pour 'xmpDM:startTime') parce que xmpDM n'a rien de générique. Ce n'est pas de cas d'imagination. La raison est que la provision du document xml peut être d'une partie tierce. Elle a la liberté de mettre n'importe quoi comme préfixe à la place de xmpDM etc sans rien changer la sémantique du document xml. Mais le namespace-uri est constant, toujours, pour préserver la sémantique. C'est pour ça tout dépendant rigide des préfixés d'une partie tierce rend le code fragile. Il faut améliorer à tout prix à cet égard.

Discussions similaires

  1. [XSLT][XPATH] recuperer une donnée d'une autre balise via un id
    Par wylenia dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 26/11/2010, 08h32
  2. recuperer une donnée de popup vers jsp
    Par Vaucluse84 dans le forum Struts 1
    Réponses: 1
    Dernier message: 20/05/2007, 22h36
  3. Réponses: 2
    Dernier message: 18/12/2006, 19h04
  4. recuperer une donnée dans le meme fichier
    Par phpaide dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 11h03
  5. [PHP] Recuperer une donnée suite a un webservice
    Par budiste dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 10/04/2006, 22h11

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