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

Langage Delphi Discussion :

Procédure permettant la création de Node XML


Sujet :

Langage Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Procédure permettant la création de Node XML
    Bonjour,

    Je travaille sur un module qui construit un arbre XML et je voudrais avoir une procédure qui prend en charge la création des noeuds.
    Voilà sa déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function SYNCHRO_CreeNoeud(var PO_NoeudParent    : IXMLNode;
                                   PC_AttributNom    : String;
                                   PC_AttributValeur : String;
                                   PC_NoeudNom       : String;
                                   PC_NoeudValeur    : String) : IXMLNode;
    La question que je me pose est de savoir si le paramètre de noeud parent doit ou non être précédé de var
    A priori oui compte tenu que la procédure fait un AddChild dessus.
    Mais quand j'appelle ma procédure j'ai une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SYNCHRO_CreeNoeud(PO_Racine.ChildNodes[i], '', '', 'NomNoeud', '');
    Merci de votre avis

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 508
    Points : 25 011
    Points
    25 011
    Par défaut
    Non, c'est des Interfaces que tu manipules, cela ne passe comme paramètre que la référence de l'interface, le var est inutile

    puis mieux comprendre, tu peux regarde l'instanciation statique et l'instanciation dynamique du C++ pour comprendre la notion de référence, en sachant qu'en Delphi, il n'y a que de l'instancation dynamique
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    OK je retire le var
    Par contre j'ajoute un noeud racine à l'arbre ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       XMLDocument.Active := True;
       XMLDocument.ChildNodes.Clear;
       LO_Racine   := XMLDocument.AddChild('root');
    J'ajoute un premier noeud à la racine ça marche toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LO_Rubrique := SYNCHRO_CreeNoeud(LO_Racine, '', '', 'Contrats', '');
    J'ajoute un noeud au niveau enfant de celui que je viens de créer et là ça claque. C'est pour cela que je me posais cette question

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 508
    Points : 25 011
    Points
    25 011
    Par défaut
    tu fais bien dans SYNCHRO_CreeNoeud ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Result := PO_NoeudParent.AddChild(PC_NoeudNom);
    Result.Text := PC_NoeudValeur;
    Result.Attributes[PC_AttributNom] := PC_AttributValeur;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Tout à fait pour l'AddChild
    Par contre je valorise NodeValue au lieu de Text mais je ne pense pas que cela vienne de là. Cela fonctionnait jusqu'à ce que j'ajoute un niveau d'arborence supplémentaire

    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
    function SYNCHRO_CreeNoeud(var PO_NoeudParent    : IXMLNode;
                                   PC_AttributNom    : String;
                                   PC_AttributValeur : String;
                                   PC_NoeudNom       : String;
                                   PC_NoeudValeur    : String) : IXMLNode;
    var
       LO_Noeud : IXMLNode;
     
    Begin
       LO_Noeud := PO_NoeudParent.AddChild(PC_NoeudNom);
       If PC_AttributNom <> '' Then
          LO_Noeud.SetAttributeNS(PC_AttributNom, '', PC_AttributValeur);
       LO_Noeud.NodeValue := PC_NoeudValeur;
       Result := LO_Noeud;
    End;
    C'est un code sur lequel je travaille le soir en plus de ma régie. Je posterai demain le message d'erreur précis.
    Merci piur l'aide

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Bonjour,

    Je pense avoir identifié mon problème.
    Si je crée un noeud comme indiqué dans les messages précédents il n'y a pas de problème.
    Par contre c'est sur la ligne suivante que la création se plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      For i := 0 To PO_Racine.ChildNodes.Count - 1 Do Begin
           LO_NoeudDetails := SYNCHRO_CreeNoeud(PO_Racine.ChildNodes[i], '', '', 'nomNoeud', '');
    Message : ne peut être effectué avec un noeud de type élément.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 508
    Points : 25 011
    Points
    25 011
    Par défaut
    en fait il doit falloir retirer le Text (NodeValue) et le mettre comme un attribut Text dans la balise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Contrats>Valeur<Contrats>
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Contrats Text="Valeur"></Contrats>
    car effectivement en XML, tu ne peux pas avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Contrats>Valeur<Enfant></Enfant></Contrats>
    mais bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Contrats Text="Valeur"><Enfant></Enfant></Contrats>
    tu peux tester IsTextElement pour vérifier si c'est un noeud Text ou un vrai Noeud
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Merci.

    Ca me paraît bizarre d'avoir tenté d'attacher des noeuds à un noeud Text.
    J'essaie ce soir.
    Je posterai la réponse (et j'espère le tag résolu) demain

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    C'était bien vu et ça marche.
    En fait même le fait de valoriser avec une chaine vide la propriété Node Value suffit à changer la propriété IsTextElement.
    J'ai modifié ainsi

    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
    function SYNCHRO_CreeNoeud(var PO_NoeudParent    : IXMLNode;
                                   PC_AttributNom    : String;
                                   PC_AttributValeur : String;
                                   PC_NoeudNom       : String;
                                   PC_NoeudValeur    : String) : IXMLNode;
    var
       LO_Noeud : IXMLNode;
     
    Begin
       LO_Noeud := PO_NoeudParent.AddChild(PC_NoeudNom);
       If PC_AttributNom <> '' Then
          LO_Noeud.SetAttributeNS(PC_AttributNom, '', PC_AttributValeur);
       If PC_NoeudValeur <> '' Then 
          LO_Noeud.NodeValue := PC_NoeudValeur;
       Result := LO_Noeud;
    End;
    Un grand merci car j'aurais mis longtemps à trouver tout seul

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

Discussions similaires

  1. [DOM] Création de balise XML
    Par Shandler dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 01/06/2006, 22h49
  2. [DOM] Pb création nodes XML dynamiques
    Par zzman dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/04/2006, 08h23
  3. [XSLT] Création de fichier XML dynamique avec PHP
    Par daninho dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 02/02/2006, 11h18
  4. programme Delphi permettant la création de base de donnée
    Par lassad dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/10/2005, 14h06
  5. editeur permettant de creer un sample xml à partir d'un xsd
    Par émile-henri dans le forum Valider
    Réponses: 5
    Dernier message: 01/06/2005, 14h02

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