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 :

TXMLDocument et EDomParseError


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut TXMLDocument et EDomParseError
    Bonjour à tous

    Je suis actuellement en train de rendre mon programme multilangue.

    j'ai donc différent fichier XML contenant les captions des boutons et autres affichages de mon application (un par langue).

    Au démarrage de mon application, je charge le document XML correspondant a la langue stocké dans un fichier ini et je renseigne tous les captions. Là pas de problème.

    Je veux donné la possibilité a l'utilisateur de changer cette langue quand il le désire. J'ai donc un menu me permettant de faire cela, qui appelle les même fonctions que lors du premier chargement du programme et ainsi charger les captions de la langue correspondante.

    Or, lors d'un changement de langue, j'ai une erreur EDomParseError

    Est-ce que quelqu'un saurais d'où peut venir le problème.

    Voici mon code :

    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
     
    // Méthode qui charge les Caption des composants
    bool __fastcall TMainForm::ChargerCaption(void)
    {
            // Chemin pour le fichier de langue
            AnsiString CheminFichierLang = ExtractFilePath(Application->ExeName) + "\Lang\\";
     
            // On fini de construire le chemin pour le fichier de langue
            CheminFichierLang += Langue;
            CheminFichierLang += ".lang";
     
            // On récupère le contenu du fichier XML
            DocumentXML->LoadFromFile(CheminFichierLang);
     
            // On active le document
            DocumentXML->Active = true;
     
            // On récupère la racine du document
            _di_IXMLNode Racine = DocumentXML->DocumentElement;
     
            ....
    }
    L'erreur se produit lorsque je veux récupérer la racine.

    Voici l'appel dans le constructeur de l'application pour le premier chargement

    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
     
            // On charge la langue
            Language();   // Méthode qui récupère la langue dans le fichier ini
     
            // On charge les captions
            if(!ChargerCaption())
            {
                    ShowMessage("Erreur dans le fichier de langue !");
     
                    // On vide le document XML
                    DocumentXML->XML->Clear();
     
                    // On désactive le document
                    DocumentXML->Active = false;
     
                    Application->Terminate();
            }
     
            // On vide le document XML
            DocumentXML->XML->Clear();
     
            // On désactive le document
            DocumentXML->Active = false;
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Salut,
    Je ne connait pas du tout les documents XML. Par contre j'ai aussi mon application multilingue avec possibilité de mise à jour par l'utilisateur.
    Si ca t'intéresse, voilà mon principe:
    J'ai un fichier texte contenant en ligne 1 toutes les langues séparées par des ';'
    Les lignes suivantes sont sous le même principe:
    1;Français;English;Italiano
    2;Bonjour;Hello;Buongiorno

    Au chargement du fichier, je teste cette première ligne et charge les langues énumérées (avec un numéro associé expl:Français = 0). Il me suffit ensuite de récupérer le texte à la ligne désirée de la langue voulue.
    Ensuite ce fichier est chargé en ressource du programme, donc interne à l'exécutable. L'utilisateur peut le sortir et le modifier. Pour être sûr du résultat la sauvegarde de cette modification n'écrase pas ce fichier, mais est enregistré comme ressource utilisateur.
    L'avantage est que si tu ouvres ce fichier sous Excel (comme un csv) tu as une bonne présentation pour le voir.

    Il existe bien d'autres méthodes, comme l'utilisation de DLL ou l'utilisation de gnutext ...

  3. #3
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Ta solution est forte intéressante mais malheureusement ne peux pas convenir a ce que je veux faire. Je veux avoir la possibilité par la suite d'ajouter des pack de langue pour éviter a la personne de réinstaller complètement l'application.

    En tout cas, merci de l'avoir proposé.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Par défaut
    Même problème en ce moment mais en créant le TXMLDocument dynamiquement
    J'ai une exception en essayant de lire la racine du documentElement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TXMLDocument *xmlDoc = new TXMLDocument("");
    xmlDoc->DOMVendor = GetDOMVendor("MSXML");
    xmlDoc->LoadFromFile( "parametring.xml" );
    xmlDoc->Active = true;
     
    _di_IXMLNode xmlDocElementNode = xmlDoc->DocumentElement;
    Apparemment le TXMLDocument doit être enregistrer dans un TDataModule mais je n'y arrive pas (FAQ borland delphi...).
    Bien sur il n'y a pas de contructeur de TXMLDocument avec un TControl.

    Help

  5. #5
    Membre émérite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Par défaut
    Citation Envoyé par kurul1
    Ta solution est forte intéressante mais malheureusement ne peux pas convenir a ce que je veux faire. Je veux avoir la possibilité par la suite d'ajouter des pack de langue pour éviter a la personne de réinstaller complètement l'application.

    En tout cas, merci de l'avoir proposé.

    Ma solution modifie la ressource de l'exe sans le recompiler ni le réinstaller. J'utilise la méthode UpdateResource pour mettre à jour le fichier de l'exe. J'ai aussi, utilisant le même principe, une variable sauvegardé pour remettre la langue, précédemment utilisé par l'utilisateur, au lancement de l'application.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Par défaut
    Problème resolu pour ma part.

    tu ne peux utiliser un TXMLDocument que si il est implémenté et enregistré dans l'environnement VCL de ton application, ce qui n'est possible apparemment qu'en Delphi.

    Donc en partant de ce principe, j'ai utilisé directement un _di_IXMLDocument et cela fonctionne correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     _di_IXMLDocument xmldoc = LoadXMLDocument("parametring.xml");
    ou
     _di_IXMLDocument xmldoc = LoadFormXML("<ROOT></ROOT>");
     
    _di_IXMLNode docElement = xmldoc->DocumentElement;

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Par défaut
    Bonjour

    Le composant TXMLDoc fonctionne aussi avec BCB 6.0.
    J'ai le code suivant qui charge un fichier XML et l'affiche dans un TMemo, il tourne sans problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	XMLDoc->LoadFromFile("exxai.xml");
    	Memo1->Clear();
    	Memo1->Lines->Assign(XMLDoc->XML);

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Par défaut
    Re-bonjour

    On trouve dans l'aide de BCB :
    EDOMParseError est déclenchée lorsque TXMLDocument rencontre une erreur pendant l'analyse d'un document XML.
    Donc je pencherais pour une erreur dans ton fichier XML qui ne doit pas être valide.
    Fais un essai avec un fichier XML simple dont tu es sûr de la validité.

  9. #9
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Ce que je ne comprend pas c'est que si mon fichier de langue est chargé par défaut au début de l'application, je n'ai aucune erreur.

    L'erreur surviens que lorsque je décide de changer la langue dans l'application. le chargement du fichier de langue se fait dans les deux cas par la même fonction présenté plus haut.

    Voilà comment se présente un fichier de langue :

    Français.lang
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Language>
       <Startup GroupBox1="Configurations" GroupBox2="Répertoires" Label1="Chemin des ressources" Label2="Chemin des meshs" Label3="Chemin du jeu actif" Button1="Ok">
          <PopupMenu Config="Configuration" APropos="A Propos" Langue="Langue" Quitter="Quitter"/>
       </Startup>
       <GameMain Label1="Appuyez ici pour revoir la vidéo" Label5="Appuyez ici pour continuer ..." Panel5="Valider"/>
       <MessageFichierExiste Titre="Erreur" Message="Ce fichier existe déjà !\nContinuer ?"/>
    </Language>

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 71
    Par défaut
    Pour ton fichier, commence par la première ligne
    <?xml version="1.0" encoding="iso-8859-1"?>
    sinon les caractères accentués ne sont pas valables.

    Est-ce que c'est ça qui empêche le chargement, je ne sais pas, mais cette ligne est indispensable.

  11. #11
    Membre éclairé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 934
    Par défaut
    Après de multiples recherches, j'ai enfin fini par trouver d'où venait le problème.

    Le document XML est correct, c'est pour cela que le chargement au départ fonctionnait.

    En revanche cela ne fonctionnait pas lorsque je voulais changer la langue pour la simple et bonne raison que je récupèrais le Caption de mon menu Items de langue pour connaitre la nouvelle langue.

    Je me suis aperçu en affichant la langue que je récupèrait de mon MenuItem que la première lettre de la langue était soulignée, pour marquer la lettre de raccourci et ainsi cela faisait planter la récupération du document.

    En tout cas merci à tous pour votre aide.

    Et merci à Orangina pour le rajout de la ligne car je viens de m'apercevoir à l'instant que les accent ne sortait pas.

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

Discussions similaires

  1. Problème avec le composant TXMLDocument
    Par kurul1 dans le forum C++Builder
    Réponses: 9
    Dernier message: 14/04/2005, 15h36
  2. TXMLDocument
    Par Mammuth dans le forum C++Builder
    Réponses: 7
    Dernier message: 25/03/2005, 17h02
  3. Violation d'accès sur un TXMLDocument
    Par WebPac dans le forum Composants VCL
    Réponses: 14
    Dernier message: 15/03/2005, 15h10
  4. Problème avec XML.Clear dans un TXMLDocument
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/01/2005, 11h45
  5. TXMLDocument
    Par fplanglois dans le forum Composants VCL
    Réponses: 5
    Dernier message: 15/09/2004, 23h23

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