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

XML Discussion :

[Intermédiaire] C et le querying sur un XML


Sujet :

XML

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut [Intermédiaire] C et le querying sur un XML
    Bonjour,

    J'ai un fichier XML volumineux décrivant quelques informations relatives à des villes dans plusieurs pays dans le monde. La structure du fichier XML est la suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <CityInfo>
     <country name="France">
      <city name="Paris">
        <info1> valeur 1 </info1>
        <info2> valeur 2 </info2>
      </city>
      </country>
    </CityInfo>
    Pour informations, le fichier fait 2 Mo.
    En utilisant GTK+, mon but est de faire deux listes + un formulaire de modification. Dans ma première liste j'afficherai d'abord la liste des pays, en cliquant sur un pays la deuxième liste affiche ses villes, en cliquant par la suite sur la ville, un formulaire affiche les informations courantes sur la ville pour modification.

    Mon objectif est de rendre l'affichage des villes puis des infos relatives à celles-ci le plus rapide possible et/ou en utilisant le moins d'espace mémoire.

    Une solution simple serait de parcourir l'XML, en utilisant des Handlers faire des tests afin de retrouver l'information recherchée que ce soit l'affichage des villes d'un pays, ou l'affichage des infos d'une ville. Cependant il en découle une E/S avec une recherche séquentielle assez couteuse et redondante. Celà gène-t-il à votre avis ?
    J'ai pensé à tout charger d'un seule coup dans une liste ou un arbre et faire la recherche en mémoire RAM plutot que sur le disque. Pour me simplifier l'implémentation je me demandais s'il existait une librairie qui ferait tout ce travail à ma place. En même temps, je me dis que pour la simplicité des requêtes que je vais faire, il n'est peut être pas très convenable de rajouter encore plus de dépendances à mon appli pour pas grand chose.

    Je ne sais donc pas quelle solution prendre ?
    Expat + parcours du fichier XML à chaque clic.
    Expat + chargement du contenu dans un arbre + Requêtes sur l'arbre.
    Autre solution ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 67
    Par défaut
    Personne ne peut m'aider ?

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Sans passer par une bibliotheque supplémentaire, si le nombre d'infos est toujours identique pour chaque ville, tu peux très bien déjà utiliser une structure pour tes informations sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct SVilleInfos
    {
        char NomVille[X];
        type L_Info1;
        type L_Info2;
        ...
    }VilleInfos;
    La méthode d'acces la plus rapide, à mon sens, pour accéder à une ville passerait par un "arbre binaire", mais il faut alors s'assurer de mettre un algorithme au point qui permette de:
    1- donner une valeur numérique à chaque ville
    2- cette valeur numérique soit au minimum unique en fonction du pays

    Et c'est sans compter le fait que le remplissage de l'arbre pour chaque pays risque de poser problème du fait que l'idéal est d'arriver à un arbre ayant la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
               8
           /       \
         4          12
        /  \       /   \
      2     6    10    14
     / \   / \   / \   / \
    1   3 5   7 9  11 13 15
    La structure à utiliser pour y arriver serait du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct SNoeudVille
    {
        VilleInfos *Ville;
        struct SNoeudVille *PlusGrand;
        struct SNoeudVille *PlusPetit;
    }NoeudVille
    De la meme manière, tu créerais un arbre binaire pour les pays, en te référant aux informations fournies pour l'arbre binaire des villes (trouver une valeur numérique unique pour chaque pays, et remplissage correcte de l'arbre) en utilisant une structure du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct SNoeudPays
    {
        char Nom[X];// pour récupérer le nom du pays sous forme de chaine ;)
        NoeudVille *TeteVilles //le sommet de l'arbre des villes du pays concerné
        struct SNoeudPays *PlusGrand;
        struct SNoeudPays *PlusPetit;
    }
    Avec des arbres (aussi) complets (que possible) et correctement triés, la recherche des informations sera de l'ordre de LOG N pour retrouver le pays, et, une fois le pays trouvé, de LOG N pour trouver la ville (max 16 itérations pour trouver un pays ou une ville parmis ...65535 possiblités)

    Par contre, comme je l'ai indiqué, la lecture du fichier et le tri des différents arbres risque de prendre pas mal de temps, selon l'ordre dans lequel les informations sont placées dans le fichier...

    Les méthodes de tri et de recherche de/dans les arbres seront normalement faciles à mettre au point si tu accepte l'idée de la création de fonctions récursives
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 12
    Dernier message: 27/10/2005, 13h06
  2. Executer une feuille XSLT sur du xml
    Par naiadeKaren dans le forum Général Python
    Réponses: 2
    Dernier message: 24/08/2005, 14h53
  3. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22
  4. [SAX] NoSuchElementException sur parser XML
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/05/2004, 14h42
  5. faire un Query sur un Query ?
    Par davestar dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2004, 12h30

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