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

C# Discussion :

[XmlDocument] récupérer tous les nodes


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut [XmlDocument] récupérer tous les nodes
    Bonjour à tous,

    je travaille actuellement sur des documents XML avec des objets XmlDocument en C# et j'aimerai savoir si quelqu'un connait un moyen simple de récupérer tous les noeuds (ainsi que leurs sous-noeuds) d'un seul coup sans faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    foreach(XmlNode myNode in xmlDocument) {
      // je récupère les infos de mon noeuds
      foreach(XmlNode myNode2 in myNode.ChildNodes) {
        // je récupère les infos des noeuds enfants
        foreach(XmlNode myNode3 in myNode2.ChildNodes) {
          // je récupère les infos des noeuds enfants
        }
      }
    }
    etc etc
    Si j'ais 4 ou 5 niveaux de noeuds imbriqués dans des noeuds ca devient super lourd.

    Il y a-t-il une autre méthode plus propre? J'ais beau chercher je ne trouve pas.

    Merci d'avance pour vos réponses, @+

  2. #2
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    Bonjour
    En gros, si je comprends bien tu aimerais disposer d'un membre qui te renverrais tous les noeuds du document parent en 1 coup.
    Je ne vois pas (pour cela) de solution,
    Mais, pourquoi ne pas passer par une méthode récursive ?, ce qui te permet de limiter les for each !

    en pseudo langage :

    fonction parcourNoeud(listeDesNoeuds)
    Pour chaque noeud contenu dans listeDesNoeuds
    Récupère info
    Si noeud.children existe alors parcourNoeud(noeud.children)
    Fin Boucle

    Pour récupérer les infos, je préconniserais le passage d'une collection d'objet (comportant les infos à récupérer) dans un liste également passée en param
    à parcourNoeud() et à Récupère info().

    C'est la fonction récupère info qui distinguerais les noeuds en fonction du type et récupérerais les informations en fonction.

    qu'en penses tu ?

    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  3. #3
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    pourquoi ne pas utiliser tout simplement une expression xPath :

    XmlDocument doc = new XmlDocument();
    XmlNodeList allNodes = doc.SelectNodes("//*");

    mathmax

  4. #4
    Rédacteur
    Avatar de benji_dv
    Homme Profil pro
    Architecte
    Inscrit en
    Juillet 2005
    Messages
    375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 375
    Par défaut
    ah bas oui, c'est carrément mieux !
    Benjamin DEVUYST
    Et comme l'a dit Rick Osborne
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live"
    http://bdevuyst.developpez.com
    http://blog.developpez.com/bdevuyst
    www.bdevuyst.com

  5. #5
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    Mais, pourquoi ne pas passer par une méthode récursive ?, ce qui te permet de limiter les for each !

    en pseudo langage :

    fonction parcourNoeud(listeDesNoeuds)

    Pour chaque noeud contenu dans listeDesNoeuds

    Récupère info

    Si noeud.children existe alors parcourNoeud(noeud.children)

    Fin Boucle
    Effectivement c'est ce vers quoi j'allais tendre si je ne trouve pas d'autres solutions mais pour moi le problème reste le même: +de noeuds il y a +de for s'éxécutent et sur des milliers de lignes les perfs vont pas être terrible....

    pourquoi ne pas utiliser tout simplement une expression xPath :

    XmlDocument doc = new XmlDocument();
    XmlNodeList allNodes = doc.SelectNodes("//*");

    mathmax
    Ok j'avais buté sur la compréhension des xPath dans la doc msn, mais d'après ce que vois dans c'que t'as écris ca m'parait pas mal du tout!
    Je vais tester ca tout de suite et j'vous tiens au courant.
    J'vais m'renseigner sur les xPath mais ca veut surement aussi dire que je vais pouvoir à partir du noeud root atteindre un noeud avec un xPath directement?
    Si oui c'est une expression du genre
    XmlNode myNodes = doc.SelectNode("//<noeudparent><noeudEnfantAatteindre>");
    ?

    Dans tous les cas, merci pour vos réponses.
    A de suite.

  6. #6
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    J'ais pas encore testé mais d'ores et déja pour ceux qui ferais une recherche, voici une page qui illustre bien l'utilisation des xPath : http://www.eggheadcafe.com/articles/20030627d.asp

    Je mets ce post résolu et je vais tester.
    Merci encore.
    @+

  7. #7
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    Ca marche nickel!

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

Discussions similaires

  1. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  2. Parcourir un répertoire et récupérer tous les fichiers
    Par Sniper94-2 dans le forum Windows
    Réponses: 6
    Dernier message: 08/09/2005, 01h23
  3. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 13h26
  4. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  5. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 12h51

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