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

Delphi Discussion :

[D7] XML - question débile pour trouver un noeud ...


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Par défaut [D7] XML - question débile pour trouver un noeud ...
    bonjour

    je suis en train de faire du xml avec delphi 7
    mon fichier xml ressemble a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <parent>
    < count> 2</count>
    <machin 1>
    <attr1> "blabla </attr1>
    <attr2> "blabla </attr2>
    </machin 1>
    <machin 2>
    <attr1> "blabla </attr1>
    <attr2> "blabla </attr2>
    </machin 2>
    </parent>
    j'ai utilisé TxmlDoc et maintenant libxml2 , pour l'instant j'arrive a ouvrir , lire mon fichier xml, récuperer les attributs si je connais le noeud <machin1> (par exemple)

    ce que je n'arrive pas a faire c'est dire je veux aller au noeud "machin1"
    j'ai beau lire les docs les exemples je ne trouve pas les fonctions qui font ca .. je dois pas etre réveillé mais je bloque grave dessus et parcourir comme un ane les noeud xml en testant les "name" c'est pas trés efficace ...

    si quelqu'un peut me mettre sur la voie ...

    merci

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    J'utilise directement un IXMLDocument mais la façon de procéder est la même il me semble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DocumentXML.ChildNodes['parent'].ChildNodes['machin 1'].ChildNodes['attr1']
    Et pour éviter les exceptions voir la Faq Delphi Section XML

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    tu as de la chance j'ai fait ca il n'y a pas longtemps ^^

    [QR] Comment récupérer un noeud par son nom ?

    La procédure ci-dessous permet de recupérer un noeud d'un document XML grâce à son nom

    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
    32
    33
    34
    35
    36
     
     function GetNode(XmlNode : IXmlNode;NodeName : String) : IXmlNode;
     var
      i : integer;
     begin
       Result := nil;
     
     //Les noeuds internes sont traités récursivement
       if XMLNode.NodeType <> ntElement then
         Exit;
     
       //S'il s'agit d'une feuille
       if XMLNode.IsTextElement then
         if UpperCase(XmlNode.NodeName) = UpperCase(NodeName) then
         begin
           Result := XmlNode;
           Exit;
         end;
       // S'il s'agit d'un attribut
       for i := 0 to XMLNode.AttributeNodes.Count - 1 do
         if UpperCase(XMLNode.AttributeNodes.Nodes[i].NodeName) = Uppercase(NodeName) then
         begin
           Result := XMLNode.AttributeNodes.Nodes[i];
           Exit;
         end;
     
       // Si le noeud a des enfants on recherche dedans.
       if XMLNode.HasChildNodes then
         for I := 0 to XMLNode.ChildNodes.Count - 1 do
         begin
           Result := GetNode(XmlNode.ChildNodes.Nodes[i],NodeName);
           // si on a un resultat on quitte car c'est celui qu'on recherche
           if Result <> nil then
             Exit;
         end;
     end;
    Pour l'appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     var
       Noeud : IXmlNode;
     begin
       Noeud := GetNode(XmlDoc,'MonNoeud');
       if Assigned(Noeud) then
         Showmessage(La valeur de ' + Noeud.NodeName + ' est de ' + Noeud.Text);
     end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Par défaut
    effectivement , j'avais pensé a la solution récursive , mais je trouvais ca poas "normal", car j'imaginais que en xml (peut etre avec libxml2) on pouvait avoir acces directement au noeud avec des fonctions style getnode(nodeparent , "machin")

    mais je vais faire recursivement si ca existe pas

    merci

  5. #5
    Membre expérimenté

    Profil pro
    Enseignant
    Inscrit en
    Juillet 2003
    Messages
    296
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2003
    Messages : 296
    Par défaut
    Un moyen rapide est l'utilisation de xpath. Avec OmniXML et msXML, tu dispose de fonctions selectSingleNode. Tu entres ta requête xpath et le tour est joué . c'est plus facile qu'une récursive.

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Big
    Un moyen rapide est l'utilisation de xpath. Avec OmniXML et msXML, tu dispose de fonctions selectSingleNode. Tu entres ta requête xpath et le tour est joué . c'est plus facile qu'une récursive.
    Plus facile, si tu sais utiliser OmniXML, msXML et que tu saches faire des requetes Xpath
    Et quand tu sais pas faire, le récursif aide bien ^^

    Si tu as un exemple d'utilisation je suis prenneur, je rajouterai ca à la QR ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/06/2015, 19h13
  2. Réponses: 10
    Dernier message: 05/05/2011, 17h33
  3. hibernate probleme pour trouver le hibernate.cfg.xml
    Par senediene dans le forum Hibernate
    Réponses: 3
    Dernier message: 02/09/2007, 12h29
  4. [XML]Question pour transport de données
    Par JCD_31 dans le forum XQUERY/SGBD
    Réponses: 6
    Dernier message: 21/03/2006, 22h04
  5. [SAX] Erreur pour trouver la DTD d'un fichier XML parsé!
    Par gdawirs dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/01/2006, 15h28

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