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

C++Builder Discussion :

Enregistrer les infos d'un StringGrind en format XML


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut Enregistrer les infos d'un StringGrind en format XML
    Rebonjour,

    J'ai besoin d'enregistrer les infos contenues dans un TStringGrid au format XML...

    En fait j'ai déjà une idée du code XML et il faudrait que les données du TStringGrid viennent se mettrent à certains endroits du code ( la forme générale ne change pas entre les enregistrements, je sais pas si je suis clair)...

    J'ai cherché du coté d'un composant appelé TXMLDocument - composant que je n'ai 'ailleurs pas trouvé car pas sur ma version de BCB 6 et je ne suis tombé que sur un lien mort pour le telecharger vieux de 3 ans ( via le site )

    PS: je connais RIEN à XML, ya 10 minutes que je sais que ça existe.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Si tu as les composants DB (Version Pro), tu pourrais remplacer ton TStringGrid par le couple TDBGrid + TSimpleDataSet (ou TClientDataSet)

    TXMLDocument c'est une encapsultation du IXMLDocument, tu dois pouvoir importer la Bibliothèque MSXML.DLL
    Dans mon Delphi 6 Entreprise, TXMLDocument est dans l'onglet Internet
    D7 Pro, idem, XE idem

    Sinon, si le XML n'est pas obligatoire, tu peux en à peine dix lignes de codes sérializés ton StringGrid via Stream.WriteComponent en format DFM
    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 éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Malheureusement , je ne peux pas remplacer le TStringGrid par TDBGrid + TSimpleDataSet (ou TClientDataSet) car je ne travaille pas avec une base de données... j'affiche les infos de mon TStringGrid à partir d'un fichier .txt...
    On nous a demandé de faire comme ça...

    J'arrive pas non plus à obtenir TXMLDocument, j'ai rien dans l'onglet "Internet" et je vois nul part ou je peux le chopper sur le net.

    Donc je suis embêté car le XML est imposé...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    J'ai trouvé le composant ici en téléchargement sur embarcadero. Je donne le lien si quelqu'un le cherche comme moi plus tard :

    http://cc.embarcadero.com/item/18938

    Des idées/conseils sont toujours les bienvenues

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Bon je me démerde comme je peux...
    Pour écrire sur le XMLDoc:


    <grammar>
    <lexicon uri="annuaire.lex"/>


    j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       _di_IXMLNode node_elt;
       _di_IXMLNode node_selt;
       _di_IXMLNode node_chd;
       XMLDoc->Active = true;
       XMLDoc->DocumentElement = XMLDoc -> CreateElement("grammar","");
       node_elt = XMLDoc->DocumentElement->AddChild("lexicon",-1);
       node_elt->SetAttributeNS("uri","","annuaire.lex");
    Mais j'ai ce résultat: <grammar><lexicon uri="True"/></grammar>

    Je voudrais "annuaire.lex" à la place du TRUE...

    Si quelqu'un voit la faute ...

    sur l'aide BCB de IXMLNode j'ai ceci pour la méthode SetAttributeNS:

    Définit la valeur d'un des attributs de ce noeud lorsque vous devez explicitement spécifier l'espace de nommage de l'attribut.

    void __fastcall SetAttributeNS(const DOMString AttrName, const DOMString NamespaceURI, constOleVariant Value);

    Description

    SetAttributeNS définit la valeur d'un attribut spécifié de ce noeud.

    AttrName est le nom de l'attribut. Si l'attribut existe déjà pour le noeud, sa valeur est modifiée. Si l'attribut n'existe pas déjà, un nouvel attribut est créé.

    NamespaceURI représente l'espace de nommage de l'attribut.

    Value est la valeur à affecter à l'attribut. Cette valeur est une chaîne non analysée. Toute marque (par exemple, pour une référence d'entité) est traitée comme du texte littéral et doit comprendre les séquences d'échappement appropriées. Si Value a pour valeur NULL, l'attribut est supprimé de ce noeud. Si Value est une chaîne vide, une valeur vide est affectée à l'attribut.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    trouvé la problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node_elt->SetAttribute("uri",(AnsiString)"annuaire.lex");

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Pour mettre du texte dans un noeud :

    Si quelqu'un voit l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node_tag->Text="out.result = new Object();out.result.recognizedword="blabla";";
    Le compilateur me dit qu'il manque un; , alors qu'il y en a assez ... j'ai l'impression que c'est le fait d'avoir mis autre chose entre double quotes (blabla) ça le perturbe...

  8. #8
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Je ne sais pas si c'est ce que tu souhaite faire, mais pour utiliser le caractère double quote " dans une chaîneil faut le précéder du caractère d'échappement '\'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    node_tag->Text="out.result = new Object();out.result.recognizedword=\"blabla\";";

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    C'est tout à fait ça, le problème venait de là. Thx

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    J'ai une autre question, peut être que tu pourras m'aider.

    Dans mon fichier XML qui est généré quand je clique sur un bouton, il faut qu'une partie du code se répète en fonction du nombre de ligne dans mon StringGrid... je m'explique,


    Ce code là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <item><ruleref uri="#DUPOND"/>
                                       <tag>out.result=new Object();
                                                          out.result.recognizedword="DUPOND";
                                                          out.result.extension="16";
                                                          out.result.adress="dupond@mail.fr";
                                        </tag>
    </tem>
    représente une personne avec des critères comme le poste, l'adresse email ect ...
    et ces infos sont dans le StringGrid que j'ai utilisé.
    Donc ce que je veux c'est que quand je clique sur le bouton pour générer le fichier XML, il me mettre autant de balise Item qu'il y a de lignes dans le StringGrid(=personnes)...

    J'ai pensé à faire une boucle for du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(cpt=1;cpt<StringGrid1->RowCount,;cpt++)
    mais le problème c'est qu'il va me créer à chaque fois des noeuds de même nom comme le noeud Item s'appelle node_item, le noeud tag s'appelle node_tag...
    Donc du coup ça devrait planter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
         //NOEUD SANS ATTRIBUT ITEM
          node_item = node_oneof->AddChild("item",-1);
     
           //NOEUD RULEREF
            node_ruleref = node_item->AddChild("ruleref",-1);
             node_ruleref->SetAttribute("uri",(AnsiString)"#DUPOND");
     
     
             node_tag=node_ruleref->AddChild("tag",-1);
             node_tag->Text="out.result = new Object();out.result.recognizedword=\"DUPOND\";out.result.extension=\"16\";out.result.adress=\"Dupond@mzil.fr\";";
             /* caractère d'échappement "\" pour utiliser un double quote dans une chaine
    En définitif je cherche juste à remplacer le DUPOND,DUPOND,16,Dupond@mail.com par les infos qu'il y a dans chaques lignes du stringgrid

    Je sais pas si je suis très clair mais bon...

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Je serais toi, je ferais un exemple de XML, très complet et avec l'Expert XML de C++ Builder (version Entreprise je crois), tu crés un mapping par des interfaces, cela sera plus maintenable et plus simple à utiliser

    Tu es débutant ? le problème du " non-échappé, même moi qui ne suis pas développeur C++ mais Delphi, je le sais !

    Tu peux avoir plusieurs noeuds du même nom qui se suivent, c'est avec XPath que cela pourrait poser des problèmes mais par TXMLDocument, ça passe ?

    Et effectivement, c'est pas clair ?
    tu as un problème avec Cells et sprintf ?
    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

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Merci , j'ai réussi à faire ce que je souhaitais...
    J'avais pas essayé complètement car je pensais pas qu'on pouvait créer des noeuds ayant le même nom... apparemment ça le gène pas...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Comment on fait pour ajouter un attribut à la racine ?


    Pour les autres noeud, je fais comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       node_lexicon = XMLDoc->DocumentElement->AddChild("lexicon",-1);
       node_lexicon->SetAttribute("uri",(AnsiString)"annuaire.lex");
    J'ai juste à utiliser la méthode SetAttribute comme j'ai mon noeud qui est déclaré comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       _di_IXMLNode node_lexicon;
    mais pour la racine je fais ça comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     XMLDoc->DocumentElement/*Donne accès au noeud racine du document XML.*/ = XMLDoc -> CreateElement("grammar","");

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       XMLDoc->DocumentElement/*Donne accès au noeud racine du document XML.*/ = XMLDoc -> CreateElement("grammar","");
       XMLDoc->DocumentElement->SetAttribute("xmlns",(AnsiString)"http://www.w3.org/2001/06/grammar");

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Bonjour,

    Quelqu'un sait si ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
                      "tasr://teliSpeech/w3c/grammar.dtd">
    Est réellement utile dans un document XML ou si c'est généré automatiquement...
    Car j'ai des problèmes à créer ce truc comme c'est pas vraiment un noeud auquel on peut donner des attributs...
    Merci pour vos idées

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    bug : à supprimer, merci.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 265
    Par défaut
    Bon je n'ai pas trouvé beaucoup d'informations pour mettre ceci dans le fichier XML et en passant par le composant TXMLDocument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN"
                      "tasr://teliSpeech/w3c/grammar.dtd">
    J'ai tout simplement pensé à mettre ceci sous forme de "texte" dans un noeud, cela donnerait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     XMLDoc->DocumentElement->Text="< !DOCTYPE grammar PUBLIC ""\" -//W3C//DTD GRAMMAR 1.0//EN""\"""\"tasr://teliSpeech/w3c/grammar.dtd""\">";
    Le problème c'est qu'il n'aime pas le symbole "<" ou ">" car il me met ceci dans le résultat:

    &lt; !DOCTYPE grammar PUBLIC " -//W3C//DTD GRAMMAR 1.0//EN"
    "tasr://teliSpeech/w3c/grammar.dtd"&gt;


    Donc il me remplace < par &lt et > par &gt ... aucune idée pourquoi...
    Si quelqu'un a une idée ...
    Thanks

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/05/2008, 15h28
  2. Réponses: 6
    Dernier message: 05/06/2007, 16h42
  3. Réponses: 3
    Dernier message: 13/12/2005, 15h49
  4. Enregistrer les infos login/password sur le client
    Par SheikYerbouti dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/04/2005, 09h29

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