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

Accès aux données Discussion :

[XPath/VB.Net] Comment pointer sur un noeud enfant ?


Sujet :

Accès aux données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [XPath/VB.Net] Comment pointer sur un noeud enfant ?
    Bonsoir à tous,

    J'ai quelques soucis pour manipuler XPath, alors je vous explique mon problème. J'ai une application qui exécute une procédure stockée, qui me retourne un résultat sous format XML (grâce à la ligne FOR XML AUTO). Je stocke ce résultat dans un DataSet, puis je l'enregistre au format XML dans mon répertoire. Jusque là, pas trop de problèmes. Sauf qu'au cours de cet enregistrement, j'ai des noeuds qui encapsulent mon véritable document qui se sont ajoutés.

    <NewDataSet>
    <Facture>
    <XML_F52E2B61-18A1-11d1-B105-00805F49916B>Ici se trouve mon document XML
    </XML_F52E2B61-18A1-11d1-B105-00805F49916B>
    </Facture>
    </NewDataSet>
    Voilà ce que j'obtiens dans mon document XML. Du coup, ma feuille de style XSL, qui met en page mon document XML (grâce à XSLT Transform) ne marche plus (vu qu'y a des noeuds en plus...). Ca me dérangerait pas de modifier ma feuille XSL en conséquence, mais le noeud XML_F52E2B61-18A1-11d1-B105-00805F49916B me paraît louche. Sa structure me prête à croire qu'il peut changer à tout moment, selon les paramètres passés à la procédure stockée par exemple.
    Sur les forums de Microsoft, on m'a conseillée de m'appuyer sur le noeud "Facture" (qui ne changera pas, puisque c'est moi qui donne ce nom, en remplissant le DataSet avec le DataAdapter), puis de récupérer le contenu de son noeud enfant.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            Dim sXMLPath As String = "[...]\facture.xml"
            Dim objXMLDoc As New XmlDocument()
            objXMLDoc.Load(sXMLPath)
            Dim objXPNav As XPathNavigator = objXMLDoc.CreateNavigator()
            objXPNav.MoveToRoot()
    Jusque là, tout marche. Mais je n'arrive pas à parcourir l'arborescence du document. Je voudrais que objXPNav pointe sur le noeud Facture, et qu'il récupère le contenu du noeud enfant (sans le noeud enfant en lui-même) pour l'insérer dans un nouveau fichier XML, à partir duquel je pourrais effectuer mon XSLT Transform et afficher mon document.
    Si je fais objXPNav.MoveToFirstChild(), mon XPath pointe sur le noeud NewDataSet.

    J'ai essayé de chercher sur le forum, mais je n'ai rien trouvé à ce sujet en VB. Si j'ai loupé le post, j'en suis désolée, si vous pouviez m'indiquer le lien pour que j'aille le lire ^^
    Merci d'avance

  2. #2
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    je te conseil fortement d'aller visite ce lien, superbe tuto pour parser un xmldocument.

    xpath

    et bienvenue sur developpez.com.

    ps: n'oublie de nous faire savoir si ton probleme a ete resolu.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour !

    Merci beaucoup pour le lien, il m'a permis de pointer sur le noeud <XML_F52E2B61-18A1-11d1-B105-00805F49916B> comme je le souhaitais.
    Je me suis rendue compte (d'après la coloration syntaxique) que le contenu de ce noeud (et donc mon document XML) n'est pas interprété comme un document XML. En gros, j'ai bien les balises et des attributs, mais ils ne sont pas reconnus comme tel.

    Ce que je ne sais pas faire, c'est récupérer le texte de mon noeud (j'ai essayé avec la méthode ToString, mais ça ne récupère rien.

    Je me demande si ca n'est pas à cause de la méthode WriteXml du DataSet que j'ai des noeuds en plus ?

    EDIT : J'ai réussi à sélectionner le texte que je voulais, j'essaie de l'enregistrer dans un document XML et j'explique comment j'ai fait (si ça marche), au cas où quelqu'un serait intéressé par la suite.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    En fait, j'ai compris pourquoi rien de ce que je fais ne marche.
    Mon fichier XML est enregistré avec des &lt; à la place des < et des &gt; à la place des >.
    Pourtant, j'enregistre bien avec WriteXML du DataSet.

    Quelqu'un saurait m'aider ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonsoir tout le monde,

    J'ai trouvé la solution à mon problème, donc pour ceux que ça intéresse, voilà comment j'ai procédé :

    Du côté SQL Server, il faut indiquer, à la fin de la requête : FOR XML AUTO, XMLDATA (le XMLDATA est très important, sinon, les données renvoyées ne seront pas au format XML mais sous forme de chaîne de caractères)

    Du côté client :

    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
     
            ' Déclaration de l'objet de connexion
            Dim oConnection As New SqlConnection()
            ' Ecriture de la chaîne de connexion
            oConnection.ConnectionString = ConfigurationSettings.AppSettings
    ("ConnectionString") 'ConnectionString est déclarée dans web.config
            ' Ouverture de la connexion
            oConnection.Open()
     
            'Objet SqlCommand
            Dim cmd As SqlCommand
            cmd = New SqlCommand("ProcédureStockée", oConnection)
            cmd.CommandType = CommandType.StoredProcedure
     
            'Déclaration des paramètres de la procédure stockée :
            Dim param1 As SqlParameter = cmd.Parameters.Add("nom_param",
     type_param)
            param1.Value = "" 'On affecte la valeur du paramètre
     
            'On stocke le résultat de la procédure stockée dans un
     SqlDataAdapter
            Dim da As SqlDataAdapter = New SqlDataAdapter
            da.SelectCommand = cmd
            Dim ds As New DataSet
            ds.ReadXml(cmd.ExecuteXmlReader(), XmlReadMode.Fragment)
            ds.DataSetName = "Root" 'Nom du noeud racine
     
            'Ecriture du fichier XML au moyen de la méthode WriteXml
            Dim sPath As String = "C:\[///]" 'Répertoire du fichier XML
            Dim sFile As String = "fichier.xml" 'Nom du fichier XML
            ds.WriteXml(sPath & sFile)
    Les données insérées dans fichier.xml sont bien au format XML, avec la balise <?xml version?> inscrite, et peuvent être traitées avec un XPathNavigator ^^

  6. #6
    Membre éclairé Avatar de zeavan
    Architect
    Inscrit en
    Avril 2003
    Messages
    590
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Autre

    Informations professionnelles :
    Activité : Architect

    Informations forums :
    Inscription : Avril 2003
    Messages : 590
    Points : 774
    Points
    774
    Par défaut
    sympa cela surement utile ta precision pour la requete sql.

    a+.

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

Discussions similaires

  1. se pointer sur un noeud enfant dans une arborescence XML avec Java
    Par PrFaToum dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 08/06/2012, 13h39
  2. Réponses: 0
    Dernier message: 21/10/2010, 15h55
  3. [6.5] Comment pointer sur un autre univers ?
    Par Orsombre dans le forum Webi
    Réponses: 2
    Dernier message: 17/09/2008, 14h42
  4. [DOM et JAVASCRIPT] comment iterer sur un noeud
    Par AliJava dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/12/2007, 09h24
  5. [VB.Net][Treeview] infobulle sur un noeud
    Par plasticgoat dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/11/2005, 16h13

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