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

XSL/XSLT/XPATH XML Discussion :

Récupération d'un noeud selon le texte d'un de ses enfants [XPATH 2.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Récupération d'un noeud selon le texte d'un de ses enfants
    Hello,

    Je galère pour récupérer un noeud dont un des enfants doit avoir une valeur texte définie.
    Ma chaine xpath est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //Product[contains(RecordReference/text(),"BBBB")]
    avec un XML qui ressemble à ç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
    <?xml version="1.0" encoding="UTF-8"?>
    <Docs>
    <Product>
        <RecordReference>AAAA</RecordReference>
        <NotificationType>03</NotificationType>
    </Product>
    <Product>
        <RecordReference>BBBB</RecordReference>
        <NotificationType>03</NotificationType>
    </Product>
    <Product>
        <RecordReference>CCCC</RecordReference>
        <NotificationType>03</NotificationType>
    </Product>
    </Docs>
    Je charge mon xml via SimpleXml (php) et je fais donc un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xpath = "//Product[contains(RecordReference/text(),"BBBB")]";
    $product = $xml->xpath($xpath);
    Pas d'erreur à l'exécution, mais cela ne me renvoie rien (vide)...
    Une idée?

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xpath = "//Product[contains(RecordReference/text(),"BBBB")]";
    Là, j'imagine que l'interpréteur peut comprendre quelque chose comme
    $xpath = "//Product[contains(RecordReference/text(),",
    donc je modifierais les caractères doubles quotes entourant la chaîne BBBB,
    en les remplacant par des caractères simples quotes.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour polymorphisme et merci pour ta réponse,

    J'ai mal écrit mon exemple, dans les faits ma ligne ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xpath = '//Product[contains(RecordReference/text(),"'.$value.'")]';
    $product = $xml->xpath($xpath);
    A priori je n'ai pas de problème de chaine de caractère, d'ailleurs l'interpréteur Xpath ne me sors aucune erreur de syntaxe (contrairement à quand ma requête xpath est mal formulée).

    J'ai également testé la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xpath = '//Product[RecordReference="'.$value.'")]';
    $product = $xml->xpath($xpath);
    Même combat, rien ne sort.

    Pour autant, si je fais un test de présence de l'élément en bouclant sur tous mes produits, cela fonctionne (php me dump bien le produit):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $products = $xml->Product;
            foreach($products as $product)
            {
                if($product->RecordReference == "BBBB")
                {
                    var_dump($product);
                }
            }
    Qu'est-ce qui va pas dans ma requête à votre avis?
    Merci d'avance

  4. #4
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 372
    Points
    2 372
    Par défaut
    Bonjour,

    Du coup le xpath a l'air bon, mais est-ce que cette syntaxe est sensée me ramener un noeud "Product" dont le noeud enfant RecordReference vaut la valeur que je lui passe?
    La mise en oeuvre de ton expression XPath devrait te retourner un ensemble de noeuds de type Product dont le contenu textuel de son fil RecordReference est $value.
    Le nombre de noeuds Product obtenu dans ton ensemble de noeuds dépends bien évidement de la valeur de $value.

    Pour t'en convaincre, je ne peux que t'encourager à te faire un petit test.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Vérifier aussi la présence de trucs comme xmlns

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Mon XML avec l'en-tête complète est 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?xml version="1.0" encoding="UTF-8"?><ONIXMessage release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference">
    <Header>
    <Sender>
    <SenderIdentifier><SenderIDType>06</SenderIDType><IDValue>XXXXXXXXXX</IDValue></SenderIdentifier>
    <SenderName>SERVEUR XXX - HUB YYY</SenderName></Sender>
    <Addressee><AddresseeIdentifier><AddresseeIDType>06</AddresseeIDType><IDValue>111111111111</IDValue></AddresseeIdentifier></Addressee>
    <SentDateTime>20121023T0613Z</SentDateTime>
    </Header>
    <Product>
        <RecordReference>AAAA</RecordReference>
        <NotificationType>03</NotificationType>
        <ProductIdentifier>
            <ProductIDType>03</ProductIDType>
            <IDValue>111111444222</IDValue>
        </ProductIdentifier>
    </Product>
    <Product>
        <RecordReference>BBBB</RecordReference>
        <NotificationType>03</NotificationType>
        <ProductIdentifier>
            <ProductIDType>03</ProductIDType>
            <IDValue>111222333444</IDValue>
        </ProductIdentifier>
    </Product>
    <Product>
        <RecordReference>CCCC</RecordReference>
        <NotificationType>03</NotificationType>
        <ProductIdentifier>
            <ProductIDType>03</ProductIDType>
            <IDValue>44111233322</IDValue>
        </ProductIdentifier>
    </Product>
    </ONIXMessage>
    Ça le fait comme balise xmlns?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par saintbios Voir le message
    Ça le fait comme balise xmlns?
    Ah bah un peu, oui.

    Du coup tous tes éléments sont dans un namespace, et donc dans tes xpath il faut toujours utiliser un préfixe pour indiquer leur namespace.

    Ton xpath devrait ressembler à quelque chose comme ça :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $xpath = '//ref:Product[contains(ref:RecordReference/text(),"'.$value.'")]';

    et il faudrait que tu associes le préfixe 'ref' au namespace 'http://www.editeur.org/onix/3.0/reference'.

    Ne connaissant pas PHP, je ne peux malheureusement pas te donner d'exemple.
    Simlement, XPath 1.0 c'est toujours XPath 1.0, et donc si on veut chercher des éléments dans un namespace, on doit leur donner un préfixe et c'est comme ça.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup thelvin, cela fonctionne à merveille en associant le namespace au fichier!

    Pour info l'association se fait comme cela en php (avec SimpleXml):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $xml = simplexml_load_file($pCatalog, 'SimpleXMLElement');
    $xml->registerXPathNamespace('c', 'http://www.editeur.org/onix/3.0/reference');
    Merci! et bonne fin de week end

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ns="http://www.editeur.org/onix/3.0/reference";
    $xml->registerXPathNamespace('ns',$ns);
    $value='BBBB';
    $xpath = '//ns:Product[contains(ns:RecordReference/text(),"'.$value.'")]';

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

Discussions similaires

  1. Comment récupérer le texte d'un noeud selon son attribut ?
    Par chico83 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 19/12/2014, 10h02
  2. [XML]Récupération d'un noeud via son id
    Par zegone dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 17/02/2006, 14h38
  3. récupération d'un contenu d'un texte de saisie
    Par new_wave dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 18/01/2006, 11h00
  4. [DOM] Récupération d'un noeud avec critères ?
    Par elitost dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 20/10/2005, 15h27
  5. [css+xhtml] Etirer un bloc selon le texte
    Par arnaudrou dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/08/2005, 17h21

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