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 :

Champs Memo -> String -> Xml


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Champs Memo -> String -> Xml
    Bonjour,

    J'aimerais comprendre la lecture et l'écriture au format XML.

    Je pars d'une donnée dans un champs Memo de ce type
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0" standalone="yes"?>
    <docs><datas/></docs>

    le but étant d'obtenir ce genre de chose
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" standalone="yes"?>
    <docs><datas>
    <doc Tlien="0" unc="C:\xxxxx\truc.txt" name="truc.txt"/>
    <doc Tlien="0" unc="C:\xxxxx\andouille.xls" name="andouille.xls"/>
    ....
    </datas></docs>

    Tout d'avord j'ai essayé de lire l'imformation, par exemple essayé de récupérer la valeur de unc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Noeud := XmlDoc.DocumentElement.ChildNodes['doc'];
     
      if Assigned(Noeud) then
        Showmessage('La valeur de ' + Noeud.NodeName + ' est de : ' + Noeud.Text )
    ou j'ai essayer de parcourrir :
    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
      for I:= 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do begin
      Node:= XMLDoc.DocumentElement.ChildNodes[I];
      if Node.NodeType = ntElement then begin
        if Node.NodeName = 'document' then begin
          if Node.HasAttribute('Tlien') then
          begin
            Tlien:= Node.Attributes['Tlien'];
            showmessage(typelien);
          end;
          if not VarIsNull(Node.NodeValue) then
          begin
            doc:= Node.NodeValue;
            showmessage(doc);
          end;
     
        end;
      end;
      end;
    Mais que dalle... c'est pas faute de connaitre les TTReeView mais là je comprends rien.

    un autre point :
    peut-on alimenter un xml sans partir d'un fichier ? (j'ai essayé pas mal de chose mais jamais réussi)
    par exemple :
    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
    var
      Champ : TStringList;
      i : integer;
    begin
      Champ := TStringList.Create;
      Try
        Champ.Add('<?xml version="1.0" standalone="yes"?>');
        Champ.Add('<docs><datas>'+
    	      '<doc Tlien="0" unc="C:\xxxxx\truc.txt" name="truc.txt"/>'+
    	      '<doc Tlien="0" unc="C:\xxxxx\andouille.xls" name="andouille.xls"/>'+
    	      '</datas></docs>');
     
      Champ.SaveToFile('c:\XXXX\essai.xml');
      xmlDoc.LoadFromFile('c:\XXXX\essai.xml');
    // ...
    Je n'ai pas réussi à alimenter mon xml autrement qu'en passant par un fichier sinon j'ai des messages d'erreur :
    j'ai tenté cela parmis plein de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // 1
    xmlDoc.XML := Champ; // erreur Pas de document actif
    // 2
    xmlDoc.XML.AddStrings(Champ); // idem
    // 3
      for i := 0 to Champ.Count - 1 do
        XMLDoc.XML.Add(Champ.Strings[i]); // idem

    Hier soir, j'ai failli exploser mon pc... lol, je me suis vangé sur mon jeux favoris...

    Mes intérrogations ?

    Comment lire mon fichier et au moins récupérer une valeur ?
    Si mon fichier est remplir, comment ajouter une section
    <doc Tlien="0" unc="C:\xxxxx\truc.txt" name="truc.txt"/>
    à l'intérieur de <datas></datas>
    Comment partir d'un champs mémo d'une base donnéespour alimenter directement un XML ?


    PS : j'ai évidement lu la FAQ

    Merci à vous.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Tu peux utiliser la Propriété XML du TXMLDocument pour utiliser un Stream

    Il faut utiliser la propriété Active, avant je crois comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    XML := TXMLDocument.Create(nil);
    XML.Active := True;
    XML.LoadFromStream(StringStream);

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Shail,

    Ok je vais essayé cela.

    Et pour le reste tu as une idée ?

    Merci.

  4. #4
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    En général, je fais comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xmlDoc.active := False;
    xmlDoc.XML.Text := Champ.Text;
    xmlDoc.active := True;
    La ligne 3 pète si le XML est pourri...

  5. #5
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut Exemple...
    DFM :

    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
    40
    object Form2: TForm2
      Left = 0
      Top = 0
      Caption = 'Form2'
      ClientHeight = 337
      ClientWidth = 635
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object mmo1: TMemo
        Left = 8
        Top = 32
        Width = 457
        Height = 265
        Lines.Strings = (
          '<?xml version="1.0" standalone="yes"?>'
          '<docs><datas/></docs>')
        TabOrder = 0
      end
      object btn1: TButton
        Left = 471
        Top = 30
        Width = 75
        Height = 25
        Caption = 'btn1'
        TabOrder = 1
        OnClick = btn1Click
      end
      object xmldocData: TXMLDocument
        Left = 216
        Top = 40
        DOMVendorDesc = 'MSXML'
      end
    end
    Code source :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Xml.xmldom, Xml.XMLIntf, Vcl.StdCtrls, Xml.Win.msxmldom, Xml.XMLDoc;
     
    type
      TForm2 = class(TForm)
        mmo1: TMemo;
        xmldocData: TXMLDocument;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.btn1Click(Sender: TObject);
    var
      data: IXMLNode;
    begin
      // Je le remplis avec le contenu du memo
      xmldocData.Active   := False;
      xmldocData.XML.Text := mmo1.Lines.Text;
      xmldocData.Active   := True;
     
      // J'ajoute un noeud
      data := xmldocData.DocumentElement.ChildNodes.FindNode('datas');
      if data <> nil then
      begin
        with data.AddChild('doc') do
        begin
          Attributes['Tlien'] := 0;
          Attributes['unc']   := 'C:\xxxxx\truc.txt';
          Attributes['name']  := 'truc.txt';
        end;
        with data.AddChild('doc') do
        begin
          Attributes['Tlien'] := 0;
          Attributes['unc']   := 'C:\xxxxx\andouille.xls';
          Attributes['name']  := 'andouille.xls';
        end;
     
        // Pour formater...
        mmo1.Lines.Text := Xml.XMLDoc.FormatXMLData(xmldocData.XML.Text);
      end
      else
      begin
        ShowMessage('Pas de <datas>');
      end;
    end;
     
    end.
    Il faudrait aussi ajouter un try catch pour gérer les différentes erreurs possibles...

    En sortie, j'obtiens :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" standalone="yes"?>
    <docs>
      <datas>
        <doc Tlien="0" unc="C:\xxxxx\truc.txt" name="truc.txt"/>
        <doc Tlien="0" unc="C:\xxxxx\andouille.xls" name="andouille.xls"/>
      </datas>
    </docs>

    Sinon, évite d'appeler ton composant : XMLDoc... comme c'est également le nom d'une unité, c'est pas terrible...

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Tu ne descend pas assez profondément dans l'arborescence.

    DocumentElement est le noeud racine, soit <docs> et contient un autre noeud <datas>. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Noeud := XmlDoc.DocumentElement.ChildNodes['datas'].ChildNodes['doc'];
    Cette écriture fonctionne, mais ne renverra que le premier noeud <doc>. Il faut boucler pour les énumérer tous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with XmlDoc.DocumentElement.ChildNodes['datas'] do
      for i := 0 to ChildNodes.Count -1 do
        ShowMessage(ChildNodes[i].Attributes['unc']);
    A noter que ChildNodes accepte un Tag ou un indice
    A noter aussi que tous les noeuds sont énumérés, y compris les commentaires (Noeuds de type ntComment, ex. <!-- Commentaire -->). Un petit test supplémentaire n'est pas inutile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with XmlDoc.DocumentElement.ChildNodes['datas'] do
      for i := 0 to ChildNodes.Count -1 do
        if ChildNodes[i].NodeType <> ntComment then
          ShowMessage(ChildNodes[i].Attributes['unc']);
    Pour l'écriture, il faut ajouter les noeuds avec AddChild:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with XmlDoc.DocumentElement.ChildNodes['datas'].AddChild('doc') do
      begin
        Attributes['Tlien'] := 0;
        Attributes['unc']   := 'C:\xxxxx\truc.txt';
        Attributes['name']  := 'truc.txt';
      end;
    Attention aussi au fait que les noms des noeuds sont sensibles à la case. Essaye de normaliser tout ça

    ps: Data est invariable en anglais

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Whiler Voir le message
    En général, je fais comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xmlDoc.active := False;
    xmlDoc.XML.Text := Champ.Text;
    xmlDoc.active := True;
    La ligne 3 pète si le XML est pourri...
    Salut Whiler,

    Effectivement mon erreur est que mon XmlDoc était active !! mdr
    ta solution ainsi que celle que j'avais testé fonctionne maintenant... merci


    Citation Envoyé par Andnotor Voir le message
    Tu ne descend pas assez profondément dans l'arborescence.

    DocumentElement est le noeud racine, soit <docs> et contient un autre noeud <datas>. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Noeud := XmlDoc.DocumentElement.ChildNodes['datas'].ChildNodes['doc'];
    Même en descendant comme cela mon showmessage reste vide. Mais avec la suite j'ai compris...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with XmlDoc.DocumentElement.ChildNodes['datas'] do
      for i := 0 to ChildNodes.Count -1 do
        ShowMessage(ChildNodes[i].Attributes['unc']);
    LA cela fonction trés bien j'ai bien les valeurs du noeuds du parent datas donc doc qui apparaissent.. super...

    ps: Data est invariable en anglais
    Mort de rire... quand j'ai modifié les vrais nodes et valeur j'ai fais à l'arrache mais tu a raison c'est invariable...

    Encore merci andnotor je me demande si il y a un truc que tu connais pas ? purée...

    Je vais tester la création du node avec ta méthode et celle de Whiler.

    PS : Shail, ta proposition nécissite que je créer un TStream je suppose, j'ai utilisé la mienne avec la correction de whiler.

    Merci à tous, je reviens avec mes testes de création de noeuds.

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Xml 2 le retour vers le futur,

    Impeccable que ce soit sur la méthode de whiler ou celle de andnotor ca fonctionne, même quand le noeud est vide.

    Le mec qui à inventé le format XML il doit s'alimenté au fouet, ou alors il est devenu fou.

    D'ailleur pourquoi avoir inventé ce format ? l'html ne suffisait pas ? en plus ce format est totalement libre donc on recherche a chaque fois le déchiffrage des noeuds ? enfin... question subtentiel vous me direz...

    PS : Je vous remercie, je me courcherai moins bête ce soir...

    Bye

    Mais je l'aurai un jour... je l'aurai...

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    HTML et XML sont des variantes du SGML

    HTML a un défaut, c'est que les navigateurs ont autorisé de plus en plus d'écart de structure et d'interprétation, ce qui en fait un langage peu standardisé qui a être remplacé par XHTML qui part sur une structure strict (ce qui avait été prévu à l'origine d'ailleurs mais non respecté par les utilisateurs)

    le XML par contre lui a amené une plus grand rigueur de structure tout en conservant des possibilité d'extension !


    le HTML sert à la présentation de document (voir DTD et CSS), le HTML présente les informations pour un utilisateur humain
    le XML a le même objectif mais orienté inter-process et permet bcp plus de chose (voir XSLT, DTD, XSD...) car l'on peut étendre ses balises, ce que le HTML ne permet pas !

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Merci Shail pour ces précisions.


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

Discussions similaires

  1. [AC-2003] Champ memo et longueur des string
    Par AndréPe dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2009, 10h12
  2. Lire dans un champ MEMO
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 15h54
  3. Traitement des champs memo par DBGrid
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 09h24
  4. [CR] les champs de type string
    Par yvescollet dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 05/10/2004, 16h29
  5. Remplir et relire un champ Memo dans une BD Access.
    Par Maitre Kanter dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h51

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