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 :

[XML / XPATH] Compréhension des critères de recherche


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut [XML / XPATH] Compréhension des critères de recherche
    Messieurs Dames,

    Je viens de me mettre à XPath, j'ai lu pas mal de docs et/ou tutoriaux et je n'arrive pas à comprendre d'où vient mon souci sur une recherche "simple" :

    Je vous explique.

    Voilà un exemple de donnée kseumeul dont je dispose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - <PersonnelVO xmlns="http://gronk.org/">
    - <Societe>
    	<CodeSoc>0001</CodeSoc> 
    	(...)
      </Societe>
    - <Groupe>
      <CodeGrp>001</CodeGrp> 
    	(...)
      </Groupe>
      <CptRef>64072B47-055E-4661-B568-25CBAED3B716</CptRef> 
    	(...)
      <Prenom>Vincent</Prenom> 
      <Nom>Gronk</Nom> 
    </PersonnelVO>
    (issu d'un service Web, mais là n'est pas la question)

    Je souhaite récupérer le nom de la personne via XPath.
    Si je fais selectNodes("./*"), il me retrouve bien tous les noeuds.
    Par contre, dès que je tente un filtrage des données pour aller chopper la valeur correspondant au nom, il ne me trouve jamais rien.
    (Je ne mettrai pas mes tests ici, pour ne pas vous enduire d'erreur )

    Si quelqu'un(e) avait la bonne syntaxe à me proposer, je lui serait éternellement reconnaissant (si, si )

    Bonne journée à vous.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    C'est sûrement à cause du namespace.
    Tous tes éléments sont dans le namespace "http://gronk.org/" défini par défaut dans le XML. Mais en xPath, il n'y a pas de namespace par défaut. Il faut donc définir un préfixe pour le namespace "http://gronk.org/" dans ton API xPath, et t'en servir dans tes expressions xPath.

    En supposant que tu prennes le préfixe g, l'expression pour choper le prénom devrait être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "/g:PersonnelVO/g:Prenom"
    Ou

    En moins explicite mais plus court.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut
    Merci pour cette réponse rapide qui me fait poser une autre question par rapport à :

    Citation Envoyé par thelvin Voir le message
    Il faut donc définir un préfixe pour le namespace "http://gronk.org/" dans ton API xPath
    Ca se définit où le préfixe du namespace ?

    (accessoirement, vu que je maitrise aussi le web service, je vais essayer d'en virer le namespace, histoire d'être "tranquille")

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par Skyou Voir le message
    Ca se définit où le préfixe du namespace ?
    Ben ça il faut voir avec ton API XML, comment définir un namespace dans tes expressions xPath.

    Si c'est dans une feuille XSLT, ça se définit comme n'importe quel préfixe de namespace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:g='http://gronk.org/'
    à la racine.

    (accessoirement, vu que je maitrise aussi le web service, je vais essayer d'en virer le namespace, histoire d'être "tranquille")
    Attention, ce n'est pas forcément plus simple. Beaucoup d'outils et de tutoriaux estiment que tu veux forcément mettre tes éléments dans un namespace, et ne t'expliqueront pas que faire quand ce n'est pas le cas.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut
    Re merci.

    Le namespace ne pouvant s'enlever (sinon, il le met par défaut), le dernier point est vite oublié.

    Sinon, vu qu'il s'agit d'un webservice et qu'il n'utilise pas de XSLT, j'ai déclaré dans l'en-tête de ce service :
    [WebService(Namespace = "xmlns:g='http://gronk.org/'")]

    j'ai aussi testé :
    [WebService(Namespace = "g='http://gronk.org/'")]


    Le résultat est :

    - soit une erreur lors de l'accès au service avec comme message "The schema definition with a targetnamespace of http://gronk.org/ could not be found"
    - soit une erreur lors de la demande de filtre via XPath avec comme message "Reference to undeclared namespace prefix : g"

    Et comme 99% des résultats de mes recherches sur la toile font référence à des erreurs du genre "Reference to undeclared namespace prefix : xsd" bah c'est pô gagné

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par Skyou Voir le message
    Sinon, vu qu'il s'agit d'un webservice et qu'il n'utilise pas de XSLT, j'ai déclaré dans l'en-tête de ce service :
    [WebService(Namespace = "xmlns:g='http://gronk.org/'")]

    j'ai aussi testé :
    [WebService(Namespace = "g='http://gronk.org/'")]
    Hum, pourquoi faire ?

    Il est très bien ton webservice, c'est du côté qui fait du xPath qu'il faut déclarer le namespace.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut
    Je viens de trouver d'autres éléments sur Développez (bien cachés).
    En langages .NET, ça a l'air de bien se passer, puisque les méthodes SelectSingleNode ou SelectNodes peuvent prendre 2 arguments, le second étant le namespace.

    Mais là, je suis en VB6 (obligé, contraint, sous la force ) et ces méthodes ne prennent qu'un argument.

    Ca va être chô, je pense pour réussir à le faire fonctionner, ce bouzin...

    En tout cas, merci M. Thelvin, toutes ces remarques m'ont mis sur une bonne piste.
    Ca ressemble étrangement à un cul de sac (merci Krosoft), a moins que je me gourre encore... (ce qui est loin d'être improbable)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Points : 63
    Points
    63
    Par défaut
    Yes !
    Victoire !

    Bon, alors astuce en VB6 pour réussir à lire correctement un contenu XML issu d'un webservice :

    - ne pas passer par les DomSelection (résultat "brut" d'une requête SOAP)

    Utiliser plutôt :

    1. Créer un document XML (DOMDocumentXX où XX correspond à la version que vous voulez utiliser (de rien à 60) )
    2. Le charger avec le contenu d'un élément issu de SOAP (méthode loadXML du document avec pour argument la propriété "xml" de l'élément)
    3. Assigner au document le bon namespace (méthode setProperty du document avec comme arguments "SelectionNamespaces" et le namespaceURI de l'élément)
    4. Et enfin, utiliser la méthode "selectSingleNode".


    C'est tellement simple, le développement, sous VB6

    Aller, hop, c'est la fête, un bout de code (fonction simple) qui marche :

    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
    Private Function GetProperty(uneSelection As IXMLDOMSelection, sNomPropriete As String) As String
        Dim unDocument  As New DOMDocument60
        Dim unElement   As IXMLDOMElement
        Dim unNoeud     As IXMLDOMNode
        Dim sRecherche  As String
        Dim sResultat   As String
        Dim sNameSpace  As String
    On Error GoTo GereErreur
        sNameSpace = "g"
        Set unElement = uneSelection.context
        Call unDocument.loadXML(unElement.xml)
        Call unDocument.setProperty("SelectionNamespaces", "xmlns:g='http://gronk.org/'")
        sRecherche = "//" & sNameSpace & ":" & sNomPropriete
        Set unNoeud = unDocument.selectSingleNode(sRecherche)
        If Not IsNull(unNoeud) Then
            sResultat = unNoeud.Text
        End If
        GetProperty = sResultat
        Exit Function
    GereErreur:
        Call MsgBox(Err.Number & " " & Err.Description & " (GetProperty)")
    End Function

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

Discussions similaires

  1. Trier une vue tree selon des critères de recherches
    Par alexdess dans le forum Odoo (ex-OpenERP)
    Réponses: 5
    Dernier message: 09/07/2014, 15h08
  2. définir des critères de recherches
    Par salfati dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/10/2010, 20h02
  3. Réponses: 2
    Dernier message: 05/05/2010, 12h16
  4. Réponses: 1
    Dernier message: 05/03/2010, 13h30
  5. Réponses: 9
    Dernier message: 04/02/2008, 11h49

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