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 .NET Discussion :

Problème d'écriture dans un xml depuis Delphi


Sujet :

Delphi .NET

  1. #1
    Membre du Club
    Inscrit en
    mars 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 120
    Points : 49
    Points
    49
    Par défaut Problème d'écriture dans un xml depuis Delphi
    Bonjour

    je suis débutant en xml et je souhaite modifier un fichier XML quand l'utilisateur clique sur un bouton :

    Voici le fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8" ?>
    <Utilisateurs>
      <Utilisateur id="1">
      <Surnom> Kaki </Surnom>
      <Score> 0 </Score>
      </Utilisateur>
    </Utilisateurs>
    Voici le source du code-behind de la WebForm1.aspx où se trouve un TextBox nommé Surnom et un bouton :
    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
     
    procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs);
    var UtilXml:XMLDocument;
        VieuxNoeud,objRoot:XMLNode;
        objElmtParent,objElmtChild:XMLElement;
    begin
         UtilXML:=XMLDocument.Create;
         UtilXML.Load('UtilisateursTetris.xml');
         VieuxNoeud:=UtilXML.GetElementById('1');
         objRoot:= UtilXML.DocumentElement;
         objElmtParent:= UtilXML.CreateElement('Utilisateur');
         objElmtChild:=UtilXML.CreateElement('Surnom');
         objElmtChild.InnerText:=Surnom.Text;
         objElmtParent.AppendChild(objElmtChild);
         objElmtChild:=UtilXML.CreateElement('Score');
         objElmtChild.InnerText:= '0';
         objElmtParent.AppendChild(objElmtChild);
         objRoot.ReplaceChild(objElmtParent,VieuxNoeud);
         UtilXML.Save('UtilisateursTetris.xml');
    end;
    Le problème est qu'à l'éxécution un message d'erreur apparaît pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        La référence d'objet n'est pas définie à une instance d'un objet. 
         objRoot.ReplaceChild(objElmtParent,VieuxNoeud);

    merci pour toute aide

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    mars 2006
    Messages
    1 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : mars 2006
    Messages : 1 377
    Points : 2 581
    Points
    2 581
    Billets dans le blog
    10
    Par défaut
    Quelle version de delphi utilises tu ?

  3. #3
    Membre du Club
    Inscrit en
    mars 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 120
    Points : 49
    Points
    49
    Par défaut
    Delphi 2005 Personnal

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2006
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Je ne suis pas un expert du xml mais j'ai déjà un peu cherché. voici quelques petits bouts de code pour comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //création de XMLDocument
    Self.XMLDocument1.DocumentElement := XMLDocument1.CreateElement('PROJECT','');
     
    //appel procédure écriture dans un objet défini   
    Self.Project.WriteToXMLDocument(XMLDocument1.DocumentElement);
     
    //sauvegarde du fichier XML
    Self.XMLDocument1.SaveToFile(NomFichier);

    Dans l'objet "Project" :

    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
    procedure TProject.WriteToXMLDocument(Objet : IXMLNode);
    var
      ObjectChild1, ObjectChild2 : IXMLNode;
      i : integer;
     
    begin
         WriteIntegerInXMLFile(Objet, 'Active_Model', FActiveModel);
     
        if GetNumberOfModels > 0 then
        begin
          ObjectChild1 := SetXMLChildObject(Objet, 'Models');
          for i := 0 to GetNumberOfModels - 1 do
          begin
            ObjectChild2 := SetXMLChildObject(ObjectChild1, 'Model', i);
            Self.GetModel(i).WriteToXMLDocument(ObjectChild2);  
    //procédure comparable à celle-ci mais pour un objet enfant
          end;
        end;
     
     end;
    Dans cette dernière procédure, j'utilise deux procédures que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function WriteIntegerInXMLFile(ParentObject : IXMLNode; Reference : string; val : integer; Index : integer = -1) : IXMLNode;
    begin
      result := ParentObject.AddChild(UpperCase(Reference), index);
      result.NodeValue := val;
    end;
     
    function SetXMLChildObject(parentObject : IXMLNode; Reference : string; Index : integer = -1) : IXMLNode;
    begin
      result := ParentObject.AddChild(UpperCase(Reference), index);
    end;
    On peut écrire des procédures comparables pour d'autres types que des integer. J'ai aussi écrit des procédures pour la lecture :

    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
    37
    38
    39
    function ReadIntegerInXMLFile(parentObject : IXMLNode; Reference : string; DefaultValue : integer; Index : integer = -1) : integer;
    var
      ObjetChild : IXMLNode;
    begin
      if index > -1 then
        ObjetChild := ParentObject.ChildNodes.Nodes[index]
      else
        ObjetChild := ParentObject.ChildNodes.Nodes[UpperCase(Reference)];
     
      try
        if ObjetChild.Text <> '' then
          result := ObjetChild.NodeValue
        else
          result := DefaultValue;
      except
        result := DefaultValue;
      end;
    end;
     
     
    function GetXMLChildObject(parentObject : IXMLNode; Reference : string; var found : boolean) : IXMLNode;
    begin
      result := parentObject.ChildNodes.FindNode(UpperCase(Reference));
      try
        found := not (result.NodeName = '');
      except
        found := false;
      end;
    end;
     
    function GetXMLChildObjectWithIndex(parentObject : IXMLNode; index : integer; var found : boolean) : IXMLNode;
    begin
      result := parentObject.ChildNodes.Nodes[index];
      try
        found := not (result.NodeName = '');
      except
        found := false;
      end;
    end;

    J'espère que cela pourra aider

    Emmanuel

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/02/2012, 11h44
  2. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  3. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  4. Problème d'écriture dans un tableau
    Par Hokagge dans le forum MFC
    Réponses: 46
    Dernier message: 08/07/2005, 16h47
  5. problème d'écriture dans la BD
    Par billy_ze_kid dans le forum ASP
    Réponses: 6
    Dernier message: 12/06/2005, 20h30

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