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

Outils Delphi Discussion :

[Inno Setup] Lecture d'un fichier XML


Sujet :

Outils Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Points : 27
    Points
    27
    Par défaut [Inno Setup] Lecture d'un fichier XML
    Salut à tous !

    Arrivé récemment dans ma boîte, j'ai repris le setup créé par un stagiaire sur Inno Setup. Ne connaissant pas le langage, j'ai découvert et réussi à effectuer toutes les tâches que l'on m'a confiées. Cependant, il m'en reste une dernière (enfin 2*), sur lesquelles je bloque.

    On m'a demandé de récupérer des informations présentes dans un fichier "inventory".xml, relatif à des clés de bases de données.

    Les informations ressemblent à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -<HOME_LIST>
     
        <HOME IDX="1" TYPE="O" LOC="C:oracleproduct10.2.0client_1" NAME="OraClient10g_home1"/>
     
        <HOME IDX="2" TYPE="O" LOC="C:oracleproduct11.2.0client_2" NAME="OraClient11g_home2"/>
     
        <HOME IDX="3" TYPE="O" LOC="C:oracleproduct11.2.0client_1" NAME="OraClient11g_home1_32bit"/>
     
    </HOME_LIST>

    1°) Le nombre de HOME IDX peut varier.
    2°) Pour chaque index, je dois insérer la valeur ",." dans le champ NLS_NUMERIC_CHARACTER.

    --

    J'ai fait des recherches sur Internet et j'ai toujours trouvé le même résultat : la fonction LoadValueFromXML(), créée par les utilisateurs. De plus , les forum sont en anglais, et des fois j'ai du mal à capicher ().
    Voici l'extrait (j'ai simplement modifié le nom des variables propres à mon cas) :

    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
    function LoadValueFromXML(): string;
    var 
      XMLDoc, xmlNode , Node: Variant; 
      Attrib : Variant; 
      Dir: String;
      XMLfile: string;
      valeur: string; 
      begin 
        Dir := 'C:Program FilesOracleInventoryContentsXML';
        XMLfile := 'inventory.xml';
     
        //Load the XML File  
        XMLDoc := CreateOleObject('MSXML2.DOMDocument'); 
        XMLDoc.async := False; 
        XMLDoc.resolveExternals := False; 
        XMLDoc.load(Dir + XMLfile); 
        if XMLDoc.parseError.errorCode <> 0 then 
        begin
          RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ',position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason); 
        end
        else
          begin
            XMLDoc.getAttribute('INVENTORY/HOME_LIST');
            xmlNode := XMLDoc.selectSingleNode(Dir);
            valeur := XMLNode.text;
            MsgBox(valeur,mbInformation, MB_OK);
          end
      end;

    Premièrement, j'ai du mal à comprendre son fonctionnement. Je ne comprends pas comment elle peut récupérer les informations relative à un nœud.
    Ensuite, je me mélange pas mal avec les variables, ce qui engendre le premier problème.
    Enfin, la ligne XMLDoc.getAttribute('INVENTORY/HOME_LIST') était à l'origine XMLDoc.setAttribute('HOME_LIST', 'HOME IDX') (pour mon cas).


    J'aimerais donc savoir si quelqu'un pourrait m'aiguiller la-dessus.


    Merci




    * : http://www.developpez.net/forums/d15...-partir-d-bat/

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Il faut boucler à travers les nœuds.

    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
    procedure SetOracleSeparator;
    var 
      XMLDoc, NodeList, XMLNode: Variant; 
      Dir: String;
      XMLfile: string;
      i :integer; 
    begin 
      Dir := 'C:\Program Files\Oracle\Inventory\ContentsXML\';
      XMLfile := 'inventory.xml';
     
      //Load the XML File  
      XMLDoc := CreateOleObject('MSXML2.DOMDocument.6.0'); 
      XMLDoc.async := False; 
      XMLDoc.resolveExternals := False; 
      XMLDoc.load(Dir + XMLfile); 
     
      if XMLDoc.parseError.errorCode <> 0 then 
      begin
        RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ',position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason); 
      end
      else
      begin
        NodeList := XMLDoc.getElementsByTagName('HOME');
     
        for i := 0 to NodeList.Length -1 do
        begin
          XMLNode := NodeList.NextNode;
          XMLNode.SetAttribute('NLS_NUMERIC_CHARACTER', ',.');
        end;
     
        XMLDoc.Save(Dir + XMLfile); 
      end;
    end;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Super ! Ça fonctionne, la procédure rentre correctement dans le fichier ainsi que dans le nœud.

    [EDIT3]Par contre, je voulais savoir s'il est possible d'inscrire une valeur dans la base de registre dans la section [Code], c'est à dire, pas dans la section [Registry], normalement utilisée pour ce genre d'instruction ?
    J'ai trouvé la fonction RegWriteStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean; qui permet d'écrire dans la base de registre, via le code. Cela résoud donc presque tous mes problèmes.
    J'ai donc toujours le soucis de ma première édition :

    [EDIT] Comment peut-on convertir une valeur 'variant' en 'string' ? Je souhaite voir ce que récupère XMLNode := NodeList.NextNode; et lorsque je souhaite l'afficher dans un Msgbox, il me donne une erreur de conversion. J'ai donc voulu passer par un string, mais même erreur.

    Lorsque j'appelle ses fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RegWriteStringValue(HKLM, 'SOFTWARE\Wow6432Node\ORACLE', XMLNode, ',.');
                RegWriteStringValue(HKLM, 'SOFTWARE\ORACLE', XMLNode, ',.');
    L'erreur suivante apparaît :
    Images attachées Images attachées  

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    XMLNode est un nœud XML, pas un texte.

    A noter : écrire sous Wow6432Node ne fonctionnera que si l'installateur est en mode 64 bits. C'est mieux de passer par HKEY_LOCAL_MACHINE_32 ou HKEY_LOCAL_MACHINE_64.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Merci pour cette précision, elle m'a fait améliorer la gestion de ce cas là.

    Pour récupérer la valeur du Name, il n'y a pas besoin de conversion, j'ai utilisé Value := XMLNode.GetAttribute('NAME');, tout simplement.


    --


    En tout cas, merci beaucoup de votre aide, lorsque je vous écrivais, cela me faisait penser à certaines questions que je ne voyais pas avant, et vous m'avez grandement aider !

    Et je pense que ces 2 topics pourront aider certains d'entres nous.



    Thanks a lot

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

Discussions similaires

  1. [Inno Setup] : Modification fichier xml
    Par Mimie37 dans le forum Outils
    Réponses: 3
    Dernier message: 14/03/2013, 10h28
  2. [C#-XML] - Problème de lecture fichier XML
    Par Gloups dans le forum Windows Forms
    Réponses: 9
    Dernier message: 08/08/2006, 00h40
  3. Lecture fichier xml aux caracteres accentués
    Par LFC dans le forum Modules
    Réponses: 2
    Dernier message: 13/02/2006, 19h45
  4. Réponses: 3
    Dernier message: 09/12/2005, 17h42
  5. [SAX] Problème lecture fichier xml
    Par BernardT dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2005, 18h11

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