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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Points : 39
    Points
    39
    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 chevronné

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

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    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 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    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;

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Points : 39
    Points
    39
    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 averti

    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
    Points : 441
    Points
    441
    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 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    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 ^^

  7. #7
    Membre averti

    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
    Points : 441
    Points
    441
    Par défaut
    j'avais fait un tuto complet pour dvp, qui a été refusé .
    Mais je peux te faire une source documentée sur l'utilisation de XPath et omniXML ce week-end. Je l'attacherai à ce thread .

    Sinon, l'utilisation de XPath est relativement simple. Une requête Xpath se compose un peu comme une arborescence de répertoires unix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <root>
       <node1>
         <node2>Coucou</node2>
       </node1>
    </root>
    se traduit en xpath par /root/node1/node2

    Il existe un excellent tuto sur l'utilisation de Xpath sur dvp. C'est comme ça que j'ai appris.

    Par la suite, avec omniXML ou msXML, l'utilisation est relativement simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
       node: IXMLNode;
       xml: IXMLDoc; //OmniXML
    begin
      xml := CreateXMLDoc;
     node := xml.SelectSingleNode('//node2');
     ShowMessage(node2.Text);// renvoie Coucou
    fait de tête, donc il y a des riques d'erreurs

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    ok merci ... je vais checker ca , d'ailleurs je crois que j'utilise un bout de code en C avec ce Xpath , mais bon la petite fonction récursive marche bien pour l'instant.

    sinon deuxieme question con de débutant ? quel serait le moyen de stocker une courbe dans un fichier xml ? j'ai cherché mais j'ai pas trouvé comment stocker mes points dans des vecteurs ? dans un autre format ...

    et sur le net pas d'exemple non plus ...
    typiquement je voudrais sauver une courbe de la forme :
    index | data 1 |data 2 | etc ...
    0_____ 0.01 __ 0.03
    1_____ 0.5 ___ 0.9
    2_____ 1.2____2.3

  9. #9
    Membre averti

    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
    Points : 441
    Points
    441
    Par défaut
    pour stocker un vecteur, je vois pas trop , à part stocker chaque point, genre

    <Vector>
    <point x=0 y=0/>
    <point .../>
    <Vector>

    Sinon, regarde du côté de mathML, qui est une spécification xml orienté pour les maths, ça devrait peut-être t'aider

  10. #10
    Membre averti

    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
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par Big
    j'avais fait un tuto complet pour dvp, qui a été refusé .
    Suite à une mauvaise compréhension de ma part, , je tiens à rectifier mes propos.
    Le tutoriel n'est pas refusé, et sera publié.

    Toutes mes excuses à l'équipe de developpez

  11. #11
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Citation Envoyé par Big
    Suite à une mauvaise compréhension de ma part, , je tiens à rectifier mes propos.
    Le tutoriel n'est pas refusé, et sera publié.

    Toutes mes excuses à l'équipe de developpez
    Excuses acceptées

    Une fois que tu auras finalisé le tutoriel, il faudra le proposer à la correction ortho avant la publication

    Merci.

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