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

ASP.NET Discussion :

Accéder à un noeud XML spécifique


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Accéder à un noeud XML spécifique
    Salut tout le monde.

    Je débarque sur de l'XML et je bloque sur un truc qui me parait tout bête, mais peut-être pas.

    J'ai suivi ce tuto qui me parait trés bien : http://selkis.developpez.com/tutoriels/dotnet/Xmlpart1/

    Pour poser mon truc avec son exemple je voudrais pouvoir remonter l'URL en fonction du NOM trouvé.
    Je ne comprnds pas comment j'accède à un noeud par son "nom" indiqué dans la structure XML

    Je voudrais faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    For Each noeud In element
                For Each noeudEnf In noeud.ChildNodes
                    If noeudEnf("NOM").InnerText = "peuw.net" Then
                        hl.navigateUrl = noeudEnf("URL").InnerText
                    End If
                Next
            Next
    Mais ça marche pas. Sur le If, il me dit :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Et là, je comprend pas.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Salut,

    Peux-tu poster un extrait du XML pour qu'on voit la structure ?

    Sinon si tu es sur .NET 3.5 il y a aussi Linq to XML, qui est sans doute un peu plus facile à utiliser (surtout en VB vu qu'une syntaxe spécifique a été ajoutée dans VB9)

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Tout est dans le tuto. Mais voilà un copier coller de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     <lstSite>  
          <SITE> 
                <URL>http://www.peuw.net/index.xml</URL> 
                <NOM>peuw.net</NOM> 
          </SITE> 
          <SITE> 
                <URL>http://www.poxx.net/index.xml</URL> 
                <NOM>poxx - Science Fair</NOM> 
          </SITE>
    </lstSite>
    Sinon, Linq To XML, je veux bien. Tu as un tuto d'introduction qui va bien ?
    Mais il faut savoir que je n'ai jamais fais de Linq, tout court.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ce serait pas plutôt ça que tu veux faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If noeudEnf.LocalName = "NOM" AndAlso noeufEnf.InnerText = "peuw.net" Then
            hl.navigateUrl = noeudEnf("URL").InnerText
        End If
    noeudEnf("NOM"), ça veut dire l'élément enfant de noeudEnf qui a pour nom "NOM". Or dans ce cas, l'élément "NOM" correspond déjà à noeudEnf, ce n'est pas un enfant de noeudEnf...

    Perso je trouve ce tuto pas terrible ... le code est brouillon, et c'est vraiment pas la façon de faire la plus simple. J'aurais plutôt fait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim doc As New XmlDocument()
        doc.Load(urlDuFichier)
        For Each siteElement As XmlNode In doc.GetElementsByTagName("SITE")
            Dim nomElement As XmlNode = siteElement("NOM")
            Dim urlElement As XmlNode = siteElement("URL")
            Dim nom As String = nomElement.InnerText
            Dim url As String = urlElement.InnerText
            Console.WriteLine("{0} : {1}", nom, url)
        Next
    (remplace Console.WriteLine par ce que tu veux faire avec les valeurs...)

    Avec Linq to XML, ça donne quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim doc As XDocument = XDocument.Load(urlDuFichier)
        Dim sites = _
            From siteElement In doc.Root.<SITE>
            Select New With
            {
                .Nom = siteElement.<NOM>.Value,
                .Url = siteElement.<URL>.Value
            }
     
        For Each site In sites
            Console.WriteLine("{0} : {1}", site.Nom, site.Url)
        Next
    Je te laisse regarder ça plus en détails sur MSDN :
    http://msdn.microsoft.com/fr-fr/library/bb384460.aspx

    Sinon je te conseille vivement de jeter un oeil à Linq en général (pas seulement Linq to XML), ça facilite vraiment la vie une fois que tu commences à maitriser à peu près. En gros, ça permet de faire des requêtes, un peu comme en SQL, sur virtuellement n'importe quelle source de données (XML, base de données, objets...), et de façon sûre car c'est vérifié par le compilateur (contrairement au SQL par exemple)

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci Tomlev.

    Je test tout ça dés que possible, là je dois filer, un train à prendre.

    Linq, c'est dans mon planning depuis pas mal de temps, sauf que j'ai un poil d boulot à faire enpriorité, pour ne aps dire en urgence. Du coup, je reporte. Mais dés que j'ai du mou, je m'y mets parce que ton argumentaire, c'est justement ce que j'en avais lu, alors ça me va super bien.

    Bon week-end à toi
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    J'ai testé le premier bout de code. J'ai une erreur sur la ligne dans le IF (hl.navigateUrl = noeudEnf("URL").InnerText) où il me dit :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Du coup, je me demande s'il ne faut pas refaire une test pour trouver le nom du noeud. Mais je trouve cette manière de faire complètement débile ou alors, c'est moi qui capte pas le principe du biniou.

    Ensuite, sur ton deuxième bout de code, certes, ça m'a l'air plus sexy mais là tu liste toutes les entrées pour en faire un truc. Moi je veux sélectionner une entrée par rapport à un critère. Mon principe reste de trouver l'adresse d'un site par rapport à son nom envoyé en variable ou paramettre d'une Procédure (par exemple). Vois tu ce que je veux dire ?

    Quant à ton exemple de Linq, j'ai l'impressoin que tu liste toutes les donnée pour les afficher. Et là, mon niveau n'est clairement pas suffisant pour adapter.

    Mais je garde ça et le lien en réserve. Comme dis plu tôt, Linq, je vais y passer, mais il me faut du temps pour bien mettre en place les choses. Je compte garder un serveur SQL pour placer les données dans les tables, mais j'élimerais toutes les Procédures Stockées. C'est clair que je pourrais faire des choses plus performantes comme ça. Je garderais peut-être des View histoires d'avoir des sélections de donnée indexées pré établies, mais à voir, surtout en terme de perfomance.

    Mais bon, là n'est pas le sujet pour l'instant. Promis, je reviendrais vers toi quand le moment de Linq sera venu. Pour l'instant faut vraiment que j'aille vite pour trouver mon truc dans mon fichier XML. C'est une pétouille mais je la veux propre.

    Merci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    J'ai testé le premier bout de code. J'ai une erreur sur la ligne dans le IF (hl.navigateUrl = noeudEnf("URL").InnerText) où il me dit :
    Ben je t'ai expliqué dans mon précédent post : noeudEnf correspond déjà à la balise <NOM> ou <URL> (du moins si tu as gardé la même structure que dans le tuto. Donc noeudEnf("NOM"), ça cherche un enfant de noeudEnf avec le tag <NOM>, et il n'y en a pas.



    Citation Envoyé par zooffy Voir le message
    Ensuite, sur ton deuxième bout de code, certes, ça m'a l'air plus sexy mais là tu liste toutes les entrées pour en faire un truc. Moi je veux sélectionner une entrée par rapport à un critère. Mon principe reste de trouver l'adresse d'un site par rapport à son nom envoyé en variable ou paramettre d'une Procédure (par exemple). Vois tu ce que je veux dire ?
    Ben tu rajoutes un test dans la boucle : si la variable nom est égale à ce que tu cherches, tu récupères l'URL et tu sors de la boucle

    Citation Envoyé par zooffy Voir le message
    Quant à ton exemple de Linq, j'ai l'impressoin que tu liste toutes les donnée pour les afficher. Et là, mon niveau n'est clairement pas suffisant pour adapter.
    C'est un peu comme en SQL, il faut faire un Where . Pour récupérer le premier élément d'une requête Linq, tu peux utiliser la méthode First

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim doc As XDocument = XDocument.Load(urlDuFichier)
        Dim sites = _
            From siteElement In doc.Root.<SITE>
            Where siteElement.<NOM>.Value = leNomQueTuCherches
            Select New With
            {
                .Nom = siteElement.<NOM>.Value,
                .Url = siteElement.<URL>.Value
            }
     
        Dim monSite = sites.First()
        Console.WriteLine("{0} : {1}", monSite.Nom, monSite.Url)

  8. #8
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben je t'ai expliqué dans mon précédent post : noeudEnf correspond déjà à la balise <NOM> ou <URL> (du moins si tu as gardé la même structure que dans le tuto. Donc noeudEnf("NOM"), ça cherche un enfant de noeudEnf avec le tag <NOM>, et il n'y en a pas.
    C'est ça que j'ai du mal à comprendre, en fait. Je dois trop raisonner comme en SQL alors qu'il faut raisonner en lecture séquentielle du truc, je crois.
    Mais bon, je crois avoir trouvé en prenant le deuxième bout de code.


    Citation Envoyé par tomlev Voir le message
    Ben tu rajoutes un test dans la boucle : si la variable nom est égale à ce que tu cherches, tu récupères l'URL et tu sors de la boucle
    J'ai fais un IF dans la boucle, mais j'ai pas fais d'action pour sortir (parce que je me rappelle plus la syntaxe de la commande qui arête le For Each !!). Je sais pas trop si c'est grave.
    En tout cas ça marche.


    Citation Envoyé par tomlev Voir le message
    C'est un peu comme en SQL, il faut faire un Where . Pour récupérer le premier élément d'une requête Linq, tu peux utiliser la méthode First
    Ok, je vois bien le truc, mais maintenant je suis confronté à un autre soucis et je crois que je vais pas prendre le temps de le régler de suite. Lorsque je copie/colle ton code il me dit sur le Xdocument qu'il est pas défini. J'ai ajouté des Imports sur System.Linq mais ça n'a rien changé. En fait, je crois que j'ai pas instalé Linq.

    Bon pas trés grve, on va dire que j'ai trouvé la solution à mon problème avec une lecture XML basique, merci pour ton aide et je verrais Linq à tête reposée, quand j'aurais plus de temps devant moi.

    Je vais faire un autre essai avec une structure XLM plus chargée car je dois faire le truc avec d'autre bloc XML, si j'y arrive pas, je reviens, sinon, je bouclerais le sujet.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    je me rappelle plus la syntaxe de la commande qui arête le For Each !!
    Citation Envoyé par zooffy Voir le message
    Ok, je vois bien le truc, mais maintenant je suis confronté à un autre soucis et je crois que je vais pas prendre le temps de le régler de suite. Lorsque je copie/colle ton code il me dit sur le Xdocument qu'il est pas défini. J'ai ajouté des Imports sur System.Linq mais ça n'a rien changé. En fait, je crois que j'ai pas instalé Linq.
    Il faut ajouter une référence à System.Xml.Linq.dll, et le namespace est System.Xml.Linq (normalement VS devrait te le proposer automatiquement si tu fais [Ctrl + .])

    Par contre il faut être en .NET 3.5, ça n'existe pas dans les versions précédentes...

  10. #10
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, merci beaucoup.
    Je suis en 3.5, peut-être même en 4.0, mais je sais plus où j'en suis des MAJ.

    Faut que je regarde mes références pour voir si j'ai bien celle qu'il faut.

    Un grand, trés grand merci pour tout.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

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

Discussions similaires

  1. [Débutant] Accéder noeud XML spécifique
    Par bob633 dans le forum C#
    Réponses: 4
    Dernier message: 22/12/2011, 16h13
  2. [Ajout noeud xml] comment ça marche?
    Par noobiewan kenobi dans le forum Format d'échange (XML, JSON...)
    Réponses: 37
    Dernier message: 19/07/2007, 22h46
  3. Accéder noeud XML
    Par GogNav dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2007, 16h05
  4. Accéder à un noeud XML
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/06/2007, 12h56
  5. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 19h29

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