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 :

Synthaxe de Xpath [XPATH 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut Synthaxe de Xpath
    Hello,

    Je viens de découvrir XPATH dans mon projet WPF, et c'est bien pratique. Par contre, je galère un peu à trouver la bonne syntaxe. Je cherche à réaliser une expression qui peut se décrire comme il suit:

    Parmi les enfants de "manifest", je veux la valeur de l'attribut "href" pour tous les noeuds "item" dont l'attribut "media-type" est "application/xhtml+xml"

    merci pour votre aide!

    EDIT: j'ai mis dans le titre de sujet XPATH 1.0 mais je n'ai aucune idée de la version que j'utilise.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 578
    Par défaut
    il faut utiliser un prédicat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alphonse/bernard[cyril = 'didier']/ethan
    "Parmis les enfants de <alphonse>, je veux la valeur <ethan> de tous les <bernard> dont <cyril> vaut 'didier'."

    Ou en déroulant :

    "Prends les <alphonse>. Dedans, prends les <bernard>, mais seulement ceux dont <cyril> vaut 'didier'. Dedans, prends les <ethan>"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Merci pour ta réponse Thelvin. Si j'ai bien suivi, dans mon cas, ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    package/manifest/item[media-type='application/xhtml+xml']/href
    Ni dans mon code, ni dans xmlspy ça ne renvoie de résultats.

    Pour info, voilà un aperçu du fichier avec les lignes que je veux atteindre en gras. En gros je veux récupérer dans ce cas "MyFile_split_001.htm"
    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
    <?xml version="1.0"  encoding="UTF-8"?>
    <package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="uuid_id">
      <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:calibre="http://calibre.kovidgoyal.net/2009/metadata" xmlns:dc="http://purl.org/dc/elements/1.1/">
    blablabla
    
    </metadata>
    <manifest>
        <item href="cover.jpeg" id="cover" media-type="image/jpeg"/>
        <item href="MyFile_split_000.htm" id="html2" media-type="application/xhtml+xml"/>
        <item href="MyFile_split_001.htm" id="html1" media-type="application/xhtml+xml"/>
        <item href="image001.jpg" id="added" media-type="image/jpeg"/>
        <item href="image002.jpg" id="added1" media-type="image/jpeg"/>
        <item href="page_styles.css" id="page_css" media-type="text/css"/>
        <item href="stylesheet.css" id="css" media-type="text/css"/>
        <item href="titlepage.xhtml" id="titlepage" media-type="application/xhtml+xml"/>
        <item href="toc.ncx" media-type="application/x-dtbncx+xml" id="ncx"/>
      </manifest>
    
    Autre noeuds
    </package>

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    J'ai trouvé. Il manquait les arobases. Voilà ce que ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    package/manifest/item [@media-type = "application/xhtml+xml"]/@href

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Je me suis réjoui trop vite, ça marche dans xmlspy mais pas dans mon code (vb .net, appli WPF)

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 578
    Par défaut
    Ta dernière syntaxe est pourtant correcte.

    Peut-être que dans WPF tu utilises une API qui ne récupère qu'une seule valeur, au lieu d'un ensemble de valeurs ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    J'utilise la classe System.XML de windows pour accéder au XML. Au cas où tu y verrais quelques chose que je n'y vois pas, voilà l'instanciation et l'appel:

    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
     
    Dim ContentTypeNamespace As String = "http://schemas.openxmlformats.org/package/2006/content-types"
     Dim xmlDoc As New XmlDocument()
                    xmlDoc.PreserveWhitespace = True
                    xmlDoc.Load(contentTypes)
                    contentTypes.Close()
     
                    'Create an XmlNamespaceManager for resolving namespaces
     
                    Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
                    nsmgr.AddNamespace("t", ContentTypeNamespace)
     
                    ' For each doc, let's extract text
     
                    Dim node As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("package/manifest/item[media-type='application/xhtml+xml']/href", nsmgr)
                    For Each activeNode As XmlNode In node
                        Extract_text(activeNode.Value)
                    Next
    Dim node As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("package/manifest/item[media-type='application/xhtml+xml']/href", nsmgr)

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 578
    Par défaut
    Euh, ouais enfin, du VB c'est pas trop à moi qu'il faut en montrer.

    Ceci étant dit, au moins le MSDN est bien documenté, et je remarque ceci :
    - Tu as à nouveau oublié les @ pour désigner des attributs au lieu d'éléments.
    - Dans DocumentElement il y a Element, donc a priori tu es déjà dans <package> et donc tu ne peux pas le sélectionner à nouveau.
    - Tu as deux fois la même ligne.
    - À part ça, ça devrait aller.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Voici ce qu'il faut corriger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nsmgr.AddNamespace("t", ContentTypeNamespace)    'si vous avez un usage pour ContentTypeNamespace, sinon ce n'est pas le bon
    nsmgr.AddNamespace("ns", "http://www.idpf.org/2007/opf")
     
    'Dim node As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("package/manifest/item[media-type='application/xhtml+xml']/href", nsmgr)
    Dim node As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/ns:package/ns:manifest/ns:item[@media-type='application/xhtml+xml']/@href", nsmgr)
    'etc etc...

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 578
    Par défaut
    Ah, oui. XPath 1.0, et namespaces. J'avais oublié.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Par défaut
    Messieurs je vous bénis. Je revenais sur le sujet après avoir réalisé que c'était un souci de namespace, mais j'ignorais ce qu'il fallait mettre pour odt. Merci beaucoup

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/06/2010, 14h36
  2. [XPath] Position d'un élément
    Par ovh dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 07/04/2003, 15h26
  3. sum(XPATH) retourne NaN
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 19/03/2003, 13h48
  4. XPath: intersection de chemins
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/03/2003, 10h30
  5. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 15h46

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