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 :

[XPATH][Débutant]Requête d'interrogation sur un fichier multi-schéma ?


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut [XPATH][Débutant]Requête d'interrogation sur un fichier multi-schéma ?
    Salut,
    voici le contexte, je récupère un fichier XML via un WebService de Microsoft (MTPS content Service) à l'aide du soft MsdnMan et ce sous PowerShell (.NET 2.0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .\msdnman.exe Microsoft.Win32.RegistryKey.OpenRemoteBaseKey  -loc fr-fr -language c# -Nologo -XML|Set-content $pwd\OpenremoteBaseKey.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
     
    <?xml version="1.0" encoding="ibm850"?>
    <response>
      <primary>
        <div class="topic" xmlns:mtps="<a href="http://msdn2.microsoft.com/mtps" target="_blank">http://msdn2.microsoft.com/mtps</a>" xmlns="<a href="http://www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>">
          <div class="majorTitle" xmlns:asp="<a href="http://msdn2.microsoft.com/asp">Biblioth?que" target="_blank">http://msdn2.microsoft.com/asp">Biblioth?que</a> de classes .NET Framework<!---->
          </div>
          <div class="title" xmlns:asp="<a href="http://msdn2.microsoft.com/asp">RegistryKey<mtps:LanguageSpecificText" target="_blank">http://msdn2.microsoft.com/asp">Regi...geSpecificText</a> runat="server">
           <variation devLang="cs">.</variation><variation devLang="vb">.</variation>
           <variation devLang="cpp">::</variation><variation devLang="nu">.</variation>
           </mtps:LanguageSpecificText>OpenRemoteBaseKey, m?thode <!---->
          </div>
          <!--
          Content type: Devdiv1. Transform: orcas2mtps.xslt.
        -->
          <mtps:MemberLink Target="AssetId:T%3aMicrosoft.Win32.RegistryKey" Text="RegistryKey, classe" runat="server" />
          <div id="mainSection"> <div id="mainBody">  
    ...
    Ensuite je filtre le résultat obtenu et essaie de récupérer une partie du fichier XML avec XPath mais je rencontre quelque soucis avec la requête.
    Dans SketchPath si je me positionne sur le noeud le soft affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    response/primary/div/div[3][@id="mainSection"]
    J'ai essayé cette syntaxe sur plusieurs outils sans résulat.
    Le premier soucis si j'interroge sur le "noeud primaire"
    cela fonctionne, sur le suivant aussi :
    mais dés que j'atteint ce niveau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    response/Primary/div/
    aucun résultat.

    Etant débutant sous XPath, il y a qq chose que je n'ai peut être pas compris, en tout cas avec les XSD fournis j'ai un peu de mal.
    J'ai consulté qq tuto sur le sujet mais les exemples sont basés sur des fichier XML trés simple.

    J'aimerais savoir :
    - XPath peut-il avoir un comportement différent selon les outils/plateforme ?
    - le fait d'avoir un fichier XML multi-schéma, c'est ce que j'ai cru comprendre pour MTPS, nécessite-t-il une syntaxe particulière.
    - la syntaxe suivante est-elle correcte : response/primary/div/div[3][@id="mainSection"] ? Je suis surpris de trouver une notion d'indexation associé à XML .
    - et enfin comment procéder pour obtenir le contenu du noeud <div id="mainSection"> ?

    En espérant avoir été suffisament clair !

    Le fichier joint contient les XSD et le fichier XML cité.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Je dirais que c'est un pb de namespace.
    L'xml que tu as posté est mal formé, ce qui rend l'analyse plus difficile, mais je suppose que c'est un pb de conversion automatique des URLs du forum.
    Bref, un des "attributs" de div est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns="http://www.w3.org/1999/xhtml"
    , donc son espace de nom n'est plus celui par défaut et doit donc être indiqué dans le xpath.
    Je ne sais pas comment tu manipules ce xpath, le moyen de spécifier le namespace diffère.
    En XSL-T il faudrait spécifier un préfixe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    et après le xpath deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response/primary/xhtml:div/xhtml:div[3][@id="mainSection"]

  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse .
    Citation Envoyé par Morbo
    je suppose que c'est un pb de conversion automatique des URLs du forum.
    Oui car celui posté était correcte.
    Citation Envoyé par Morbo
    Je ne sais pas comment tu manipules ce xpath, le moyen de spécifier le namespace diffère.
    Avec les API dotNET 2.0.
    Citation Envoyé par Morbo
    donc son espace de nom n'est plus celui par défaut et doit donc être indiqué dans le xpath.
    Ok. Si j'ai bien compris je dois donc préciser chaque espace de nom que je risque de rencontrer dans mon interrogation. Dans le cas suivant :
    <div class="topic" xmlns:mtps="http://msdn2.microsoft.com/mtps" xmlns="http://www.w3.org/1999/xhtml">
    <div class="majorTitle" xmlns:asp="http://msdn2.microsoft.com/asp">Biblioth?que de classes .NET Framework<!---->
    cela en fait 3
    Citation Envoyé par Morbo
    et après le xpath deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response/primary/xhtml:div/xhtml:div[3][@id="mainSection"]
    Puis-je spécifier ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    response/primary/mtps:div/xhtml:div[3][@id="mainSection"]
    ?
    Bon cela ne fonctionne pas mais je vais creuser le sujet avant d'aller plus loin.
    Et concernant les autres questions as-tu qq infos ?

  4. #4
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Salut,

    Morbo t'as mis sur la voie : les éléments de ta source XML appartiennent à différents espaces de noms, et il faut que ces espaces de nom soient portés à la connaissance du moteur XPath pour que la requête se fasse dans les bons espaces.

    Je ne développe pas en .NET donc je ne peux pas être plus précis, par contre le blog de Wayne Allen devrait t'être très utile sur ce sujet.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GrandFather
    Morbo t'as mis sur la voie
    Je dirais même qu'il m'a fournis la solution.
    Citation Envoyé par GrandFather
    par contre le blog de Wayne Allen devrait t'être très utile sur ce sujet.
    J'utilisais une autre approche, un cmdlet PowerShell dédié mais sans succès. Avec l'approche full .NET cela fonctionne, j'avais trouvé une autre source sur le sujet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '/response/primary/xhtml:div/xhtml:div[@id="mainSection"]/xhtml:div/mtps:CollapsibleArea[@Title="Exceptions"]'
    C'est donc réglé sur ce point, mais si vous pouviez m'éclairer sur les autres, à savoir l'indexation et le comportement d'XPath selon les outils/plateformes...

  6. #6
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Vu le nombre d'implémentations de XPath actuellement disponible, il est difficile d'être catégorique. Mais pour en avoir utilisé une demi-douzaine, je dirais qu'aujourd'hui la grande majorité respecte à la lettre les spécifications du W3C. Les rares incompatibilités constatées portent sur des points obscurs ou ambigus de la spécification, ou très peu utilisés en pratique comme l'axe namespace. Tu peux donc y aller en confiance.

    Pour l'usage de cardinaux dans les prédicats ([3]), il ne s'agit pas à proprement parler d'une indexation des noeuds de la source XML, mais du test de la position d'un noeud dans l'ensemble des noeud sélectionnés par la recherche XPath qui précède (ou l'évaluation du prédicat qui précède).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //AAA/BBB[3][@id="mainSection"]
    Cette expression sélectionnera, pour chaque AAA, son troisième BBB fils, à la condition que son attribut id soit égal à "mainSection". Quand un prédicat de position est suivi d'un autre prédicat, ces deux prédicats sont liés par un "et" implicite, et peuvent être condensés en un prédicat unique (ici, [position() = 3 and @id="mainSection"])

    Par contre, selon la définition que j'ai donnée plus haut l'ordre d'évaluation des prédicats multiples est important, la sémantique de cette expression n'est donc pas la même que celle de la précécente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //AAA/BBB[@id="mainSection"][3]
    Là, on sélectionnera d'abord, pour chaque AAA, l'ensemble de ses fils BBB qui ont un attribut id égal à "mainSection", puis le troisième élément de chacun de ces ensembles.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

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

Discussions similaires

  1. [Débutant] modifier les droits sur un fichier
    Par DUDE007 dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2011, 05h11
  2. [DOM] [Débutant(e)] écrire sur un fichier XML à partir de java
    Par Samanta dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 05/02/2008, 11h13
  3. [débutant] Opération sur un fichier XML
    Par espadon1 dans le forum Modules
    Réponses: 5
    Dernier message: 31/05/2006, 11h38
  4. Réponses: 2
    Dernier message: 10/05/2006, 20h10
  5. [VBA] Requête SQL sur un fichier excel ?
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/01/2006, 23h06

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