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

Bibliothèques Discussion :

[XML] Savoir nombre d'un certain type de fils d'un parent


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Par défaut [XML] Savoir nombre d'un certain type de fils d'un parent
    C'est surement tout bête mais je ne sais pas comment faire pour savoir combien de <Entity class='Position' ...> il y a dans mon fichier .xml sachant qu'il peut en avoir une infinité!(enfin bcp bcp)
    Il doit exister une fonction pour ça en C++....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <Entity class="Chemin" name="Chemin sortie rafale">
                  <Location x="0.0" y="0.0" z="0.0"/>
                  <Orientation roll="0.0" pitch="0.0" yaw="1.42721895471"/>
                  <Relation name="position" value="Position 1"/>
                  <Relation name="position" value="Position 2"/>
                   <Entity class="Position" name="Position 1">
                        <Location x="20.0" y="0.0" z="0.0"/>
                        <Orientation roll="0.0" pitch="0.0" yaw="0.0"/>
                    </Entity>
                    <Entity class="Position" name="Position 2">
                        <Location x="37.8406" y="-26.4524" z="0"/>
                        <Orientation roll="0.0" pitch="0.0" yaw="0.0"/>
                      </Entity>
                </Entity>
    mici bcp

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    Le C++ standard ne permet pas de travailler directement sur des fichiers XML. Tu as des bibliothèques pour faire ça :

    - Xerces
    - Qt ...

    (Pour plus d'infos, voir la partie bibliothèques de développez.com)

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    hum, ca manque un peu d'information tout ca ^^
    Enfin surtout, comment tu parse ton fichier ?

    Enfin bref, l'idée est de faire une boucle sur les siblelings ( noeud frére que le premier "position", puis de tester ton attribut "class" a cahque fois ... en faisant ca tu aura ton nombre d'entitées avec class="position".

    en pseudo-code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int NombreEntité = 0 ;
    XmlNode = LapremièreEntité() ;
    if ( XmlNode.attribut("class") = "position" ) NombreEntitée ++ ;
    while ( XmlNode.NextSibelings() )
    {
       XmlNode = XmlNode.NextSibelings()
       if ( XmlNode.attribut("class") = "position" ) NombreEntitée ++ ;
    }
     
    std::cout << NombreEntité << std::endl ;

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    Euh ... je n'ai pas l'impression que ceci soit récursif, or elle veut peut-être parser son fichier XML aussi profondément que possible 8)

    Voici une autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int nombreEntités;
     
    void scanNode (NoeudXML n) {
       for (NoeudXML e = n.premier(); e != n.dernier(); e = e.suivant()) {
          if (e.attribut("class") == "Position") ::nombreEntités++;
          if (e.nombreEnfants() > 0) // s'il y a des enfants, on les vérifie aussi
             scanNode(e);
       }
    }
    Juste un petit problème, c'est que nombreEntités est globale, mais on peut adapter et faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void scanNode (NoeudXML n, int& nombreEntités);
    Dans ce cas là, on transmet une référence à nombreEntités qui est n'importe quel int. Il doit aussi être possible de jouer sur les valeurs de retour, mais c'est sans doute plus fin car il faut à ce moment là calculer un total et prendre en compte la récursivité là-dedans ...

    A+
    Kwakanar

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    J'ai lu vite fait, mais en gros tu scan TOUT les noeud de l'arbre XML, c'est ca?
    ( moi je suis parti du principe que tout les noeud étant issu d'un meme père )

    En fait, sans savoir ce qu'il veux faire, on ne peut de toutes facons pas établir une solution précise ^^

    Enfin, bon il a une deuxième approche maintenant

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 94
    Par défaut
    J'ai lu vite fait, mais en gros tu scan TOUT les noeud de l'arbre XML, c'est ca?
    Oui c'est ca.

    Dans son code il y a des Entity (2) mais elles sont elles mêmes filles d'une entity !!!

    debutanteVB.NET, ce serait bien que tu nous répondes

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    mais elles sont elles mêmes filles d'une entity !!!
    Ups, j'avais pas vu ca ^^

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Par défaut
    Désolée d'avoir été si longue à repondre, je fais mon projet en même temps que mes cours....

    Ce que j'utilise pour le moment c'est
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /creer un parseur et un noeud pour Global
      ArRef<XmlParser> parser2=new_XmlParser();
    	  ArRef<XmlNode> root2;
    	//place le noeud a la premiere balise
     	 root2=parser2->getRoot();
      for (int i=0; i<_n;i++)
    {
    ArRef<XmlNode> EntityPlace2=root2->getChild("Entity",i+1);//place de l'avion
    ArRef<XmlNode> locationPlace2=EntityPlace2->getChild("Location",1);//x,y,z
    ArRef<XmlNode> orientationPlace2=EntityPlace2->getChild("Orientation",1);//yaw...
    EntityPlace2->getPropertyString("name",_nomAr);//son nom
    ...

    mais là c'était dans le cas où je fixais _n ... c'est le nombre de place des avions... mais chaque avion à un nombre de chemin indeterminé et chaque chemin à un nombre de place indeterminé.C'est l'utilisateur qui le fixe.
    C'est pourquoi je voulais savoir comment on peut savoir le nombre de fils...
    J'espère avoir un peu eclairé...je ne connais pas à fond mon sujet et donc je ne sais jamais qu'est ce qui pourrait être util
    si vous voulez bien être clair dans la réponse sans trop de "charabia informatique" ça m'aiderai lol (et dire que je veux en faire mon metier... )
    bizous à tous

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 109
    Par défaut
    Bon, ça m'a bien aidé.
    J'ai eu l'idée qu'il me fallait.

    J'ai oublié de préciser que c'est avec le parseur de Arevi que je parcours mon fichier.

    Merci à tous de m'avoir aidé. Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ArRef<XmlNode> EntityRelations3=EntityPlace3->getChild("Relation",1);
    int nbreChemins=1;
    while(EntityRelations3)
    {
    	EntityRelations3=EntityPlace3->getChild("Relation",nbreChemins+1);
    	cout<<nbreChemins<<" nbreChemins"<<endl;
    	nbreChemins++;
    }

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

Discussions similaires

  1. Nombre de balise d'un certain type sur un chemin
    Par Mobius dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/08/2010, 14h43
  2. [XPATH] savoir si un noeud a des enfants d'un certain type
    Par enzostar dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 06/04/2010, 22h46
  3. Savoir s'il existe au moins un élément d'un certain type
    Par Boubou Balrog dans le forum Prolog
    Réponses: 12
    Dernier message: 07/12/2006, 18h16
  4. Réponses: 2
    Dernier message: 21/04/2005, 17h09
  5. Bloquer le téléchargement de certains types de fichiers
    Par Nikos dans le forum Développement
    Réponses: 4
    Dernier message: 23/12/2002, 20h54

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