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

XML/XSL et SOAP Discussion :

[XPath et PHP] Ma requete ne retourne aucun noeud ?


Sujet :

XML/XSL et SOAP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut [XPath et PHP] Ma requete ne retourne aucun noeud ?
    Bonjour,
    Surement une question tres conne, mais c'est pourtant pas faute d'avoir cherché. J'ai un simple fichier XML (simple pour mes tests, le final sera bien sur plus evolué, mais ca ne fonctionne deja pas avec celui-c) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8"?>
    <a>
    	<b>test</b>
    	<c>test2</c>
    	<b>test3</b>
    </a>
    Et un code PHP assez basique :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->load('test.xml');
    $xpath = new DOMXPath($doc);
    $query = 'a';
    $entries = $xpath->query($query);
    Echo "NbEntries : ".$entries->length."<br/>";
    Et la, mon souci : Le Nbentries reste deseperement à 0.
    Je loupe qqch ?
    Merci.
    Oliv.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    C'est normal : tu recherches les balises <a> depuis la position courante, c'est-à-dire la racine, or la racine ne possède pas de balise <a> !

    fonctionne mieux. Ceci dit, l'intérêt est quand même plus que limité puisque la balise racine doit être unique
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci pour cette réponse rapide. Donc, dans l'ordre :
    - La balise racine ne possede pas de balise <a>, c'est bien parce que <a> EST la balise racine, c'est ca ?
    - Pour l'interet, entierement d'accord avec toi . Mais c'etait juste un test, rien de plus.
    - Ca fonctionne maintenant avec mon doc de test, mais toujours pas avec mon doc final (un peu plus etoffé). Ca peut etre du à la présence d'une balise du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    Et donc, au niveau du query, le "//" permet de rechercher toutes les balises <a>, quelle que soit leur position / indentation dans le fichier, c'est ca ?

    Edit : Visiblement, le probleme provient d'un xmlns spécifique défini dans un sous-noeud. Je vais voir comment l'enregistrer dans mon Xpath.

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par Olif_C Voir le message
    Et donc, au niveau du query, le "//" permet de rechercher toutes les balises <a>, quelle que soit leur position / indentation dans le fichier, c'est ca ?
    On parle de profondeur plutôt que d'indentation (l'indentation c'est juste le visuel), mais oui, c'est ça.

    Là, en l'occurrence, tu aurais simplement pu écrire "/a" comme requête.

  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
    Tout document possède une racine (originelle, un peu abstracte) qui est la parent de la racine de la balise dit documentElement (ou la racine parfois pour convénence) qui est 'a' ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $query="/";
    $entries = $xpath->query($query);
    echo "NbEntries : ".$entries->length."<br/>"; //resultat: 1
    $query="/a";
    $entries = $xpath->query($query);    //edit manquant
    echo "NbEntries : ".$entries->length."<br/>"; //resultat: 1

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Non, c'est dû à la présence d'un namespace !
    Il faut passer par DOMXPath:: registerNamespace.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merveilleux, en enregistrant le XMLNS, ca fonctionne.
    J'en profite pour optimiser : lors de mes recherches, j'étais tombé sur un thread disant que pour optimiser le temps de traitement, il valait mieux dans la mesure du possible donner le path complet des nodes recherchés. Vrai ou faux ?
    Dans mon contexte, ou j'ai, pour rappel :
    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
     
    <?xml version="1.0" encoding="iso-8859-1"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    	<soap:Body>
    		<Response xmlns="http://webservices.toto.com/">
    			<a>
    				<b>
    					<c>
    					</c>
    					<d>
    					</d>
    					<c>
    					</c>
    				</b>
    			</a>
    		</Response>
    	</soap:Body>
    </soap:Envelope>
    J'ai défini mon XMLNS au niveau de mon element Response, quel est le path pour acceder aux elements <c>, par exemple ?
    Merci.
    Oliv.

  8. #8
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par Olif_C Voir le message
    lors de mes recherches, j'étais tombé sur un thread disant que pour optimiser le temps de traitement, il valait mieux dans la mesure du possible donner le path complet des nodes recherchés. Vrai ou faux ?
    En général c'est vrai, mais ça dépend des parseurs et surtout de comment est stocké le DOM.
    Par exemple ici, au boulot, notre DOM est stocké en base et certains élément structurants sont indexés, ce qui fait qu'il est (beaucoup) plus rapide d'exécuter une requête de la forme //structurant qu'une requête absolue /racine/path/to/structurant.

    Mais bon, généralement, avec la plupart des parseurs, il est plus optimal de passer par des chemins absolus quand c'est possible.

    Citation Envoyé par Olif_C Voir le message
    J'ai défini mon XMLNS au niveau de mon element Response, quel est le path pour acceder aux elements <c>, par exemple ?
    En XPath, il est nécessaire de réutiliser le xmlns pour atteindre les éléments qui sont déclarés dans un xmlns. C'est très verbeux et pénible mais c'est comme ça.

    Il te faut donc le déclarer dans ton PHP puis l'utiliser.
    N'ayant jamais fait de XML/XPath en PHP, je ne sais pas comment on le déclare mais ça doit de toute façon être sous forme de mapping : nom => uri
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->load('test.xml');
    $xpath = new DOMXPath($doc);
    // pseudo-code:
    declare_xmlns("toto", "http://webservices.toto.com/");
    $query = '//toto:a/toto:b/toto:c';
    $entries = $xpath->query($query);
    Echo "NbEntries : ".$entries->length."<br/>";

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci pour ces précisions.
    Pour info, si ca sert, le code exact pour enregistrer un NS dans un XPath est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $xPath->registerNameSpace('ns', 'http://webservices.toto.net/');
    Par contre, encore quelques eclaircissements :
    Ta requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query = '//toto:a/toto:b/toto:c';
    Ce n'est pas une requete absolue, mais plutot relative, non ? Il ne va pas chercher l'element "a" uniquement depuis la racine, mais quelle que soit sa profondeur ? Ou je fais fausse route ? C'est le "//" à la base qui me fait douter, qui sert, de ce que j'en ai compris, à lui induquer de chercher à toute profondeur du flux XML, et pas seulement à la racine, à l'opposée du "/" seul ?

    Et toujours dans mon exemple, si on considere que l'element soap:body est duplique en X exemplaires, et que j'enregistre le NS de son element fils (element "Response", NS = http://webservices.toto.com/), y a-t-il un moyen de recuperer via XPath tous mes elements soap:body, qui sont donc à l'exterieur de mon namespace enregistré ?
    Attention, fonctionnellement, je sais qu'il n'y a pas d'interet à dupliquer cet element soap:body, c'est juste pour l'exemple.

    Oliv.

  10. #10
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Citation Envoyé par Olif_C Voir le message
    Ce n'est pas une requete absolue, mais plutot relative, non ? Il ne va pas chercher l'element "a" uniquement depuis la racine, mais quelle que soit sa profondeur ?
    En effet, ce n'est pas une requête absolue. Une requête absolue serait :/soap:Envelope/soap:Body/toto:Response/toto:a/toto:b/toto:c.

    Citation Envoyé par Olif_C Voir le message
    Et toujours dans mon exemple, si on considere que l'element soap:body est duplique en X exemplaires, et que j'enregistre le NS de son element fils (element "Response", NS = http://webservices.toto.com/), y a-t-il un moyen de recuperer via XPath tous mes elements soap:body, qui sont donc à l'exterieur de mon namespace enregistré ?
    Là j'ai pas compris... tu veux faire quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!-- ... -->
    	<toto:Response>
    		<soap:Body><!-- ... --></soap:Body>
    		<soap:Body><!-- ... --></soap:Body>
    	</toto:Response>
    Si c'est ça, ben tu récupères tes body de la même façon que le reste : //soap:Body ou //toto:Response/soap:Body.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Nickel, il y a dans tes réponses toutes les infos dont j'ai besoin, et en plus ca fonctionne.
    Un GRAND merci, ca m'a permis, en plus de solutionner mon souci, d'apprendre encore pas mal de choses sur le XML et les NameSpaces.

    Oliv.

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

Discussions similaires

  1. [MySQL] Une requete qui ne retourne aucun résultats
    Par amerex dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/01/2010, 17h46
  2. Réponses: 2
    Dernier message: 26/11/2008, 09h15
  3. requete ne retourne aucun résultat
    Par sarahG dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 08/05/2008, 14h20
  4. Requete NOT EXISTS qui ne retourne aucun enregistrements
    Par uptoditime dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/12/2007, 15h18
  5. Ma requete me retourne aucune valeur
    Par zorba49 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 22/08/2005, 14h10

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