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 :

Lire fichier XML


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut Lire fichier XML
    Bonjour à tous,
    J'ai besoin d'un coup de main pour lire un fichier XML et le transformer en un autre format...
    Voici ce que j'ai fais en m'inspirant de tout ce que j'ai pu trouver sur le forum
    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
     
    procedure TTParserXml.ReadXml(Source, Destination: String);
    var
      tmpFile: TStrings;
      tmpLine: String;
      XMLDoc: TXMLDocument;
      DummyOwner: TComponent;
    begin
      DummyOwner:= TComponent.Create(nil);
      try
        tmpFile := TStringList.Create;
        XMLDoc := TXMLDocument.Create(DummyOwner);
        try
          XMLDoc.Active := True;
          XMLdoc.LoadFromFile(Source);
     
          with XMLdoc.ChildNodes.Nodes['AsRunLog'].ChildNodes do
          begin
            with Nodes['EVP'].ChildNodes do
            begin
              tmpLine :=  tmpLine + Nodes['Chaine'].Text + '|';
              tmpLine :=  tmpLine + Nodes['IdChaine'].Text + '|';
              tmpLine :=  tmpLine + Nodes['DateDeDiffusion'].Text + '|';
              tmpLine :=  tmpLine + Nodes['HeureDeDiffusion'].Text + '|';
              tmpLine :=  tmpLine + Nodes['IdDiffusion'].Text + '|';
              tmpLine :=  tmpLine + Nodes['Duree'].Text + '|';
              tmpLine :=  tmpLine + Nodes['TCin'].Text + '|';
              tmpLine :=  tmpLine + Nodes['TCout'].Text;
            end;
            tmpFile.Add(tmpLine);
          end;
          tmpFile.SaveToFile(Destination);
        finally
          XMLDoc.Free;
        end;
      finally
        DummyOwner.Free;
      end;
    end;
    mais voici le résultat lors du passage sur XMLDoc.Active := True;


    Quelqu'un sait ce que j'ai oublié..?
    Merci.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Le TXMLDocument doit appartenir à un composant de la fiche, il me semble.

    Tu peux essayer de passer par un IXMLDocument, c'est quasiment la même chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
              DocumentXML := LoadXMLData(lFile.Text); // ou LoadXMLDocument
              // Vérification de la syntaxe XML du fichier
              ParseError := (DocumentXML.DOMDocument as IDOMParseError);
              // Si Fichier correctement formé
              if (ParseError.ErrorCode = 0) then
              begin
                // Traitement du fichier XML
                ...
              end
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Ajoutes l'unité ActiveX et place ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    initialization
      CoInitialize(nil);
     
    finalization
      CoUninitialize;
    Supprime aussi ton DummyOwner. TXMLDocument n'a pas besoin de propriétaire .
    De plus, si tu n'en spécifie pas, tu peux aussi supprimer la ligne XMLDoc.Free. TXMLDocument, se comporte comme un objet interfacé et non plus comme un composant , ça destruction devient implicite.

    Il faut également faire le LoadFromFile avant l'Active.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Merci de vos réponses...
    J'essai vos solutions mais pas avec grand succès pour l'instant

    Andnotor ou dois-je place ce bloc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    initialization
      CoInitialize(nil);
     
    finalization
      CoUninitialize;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Tout en bas de ton unité, juste avant End.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Si je n'ai rien oublié et bien cela ne fonctionne pas...

    Voici toute l'unté :
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    unit ThreadParserXml;
     
    interface
     
    uses
      Classes, ActiveX, XMLIntf, XMLDoc;
     
    type
      TTParserXml = class(TThread)
      private
        Source      : String;
        Destination : String;
        procedure ReadXml(Source, Destination: String);
      protected
        procedure Execute; override;
      public
        procedure SetSource(value: String);
        procedure SetDestination(value: String);
      end;
     
    implementation
     
    { TTParserXml }
     
    procedure TTParserXml.Execute;
    begin
      inherited;
      while not Terminated do
      begin
        ReadXml(Source, Destination);
      end;
    end;
     
    procedure TTParserXml.ReadXml(Source, Destination: String);
    var
      tmpFile: TStrings;
      tmpLine: String;
      XMLDoc: TXMLDocument;
    begin
      tmpFile := TStringList.Create;
      XMLDoc := TXMLDocument.Create(nil);
      try
        XMLdoc.LoadFromFile(Source);
        XMLDoc.Active := True;
        with XMLdoc.ChildNodes.Nodes['AsRunLog'].ChildNodes do
        begin
          with Nodes['EVP'].ChildNodes do
          begin
            tmpLine :=  tmpLine + Nodes['Chaine'].Text + '|';
            tmpLine :=  tmpLine + Nodes['IdChaine'].Text + '|';
            tmpLine :=  tmpLine + Nodes['DateDeDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['HeureDeDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['IdDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['Duree'].Text + '|';
            tmpLine :=  tmpLine + Nodes['TCin'].Text + '|';
            tmpLine :=  tmpLine + Nodes['TCout'].Text;
          end;
          tmpFile.Add(tmpLine);
        end;
        tmpFile.SaveToFile(Destination);
      finally
        tmpFile.Free;
      end;
    end;
     
    procedure TTParserXml.SetDestination(Value: String);
    begin
      try
        Destination := Value;
      except
      end;
    end;
     
    procedure TTParserXml.SetSource(Value: String);
    begin
      try
        Source := Value;
      except
      end;
    end;
     
    initialization
      CoInitialize(nil);
     
    finalization
      CoUninitialize;
    end.
    Vois-tu ou est le problème ?

    Edit : l'erreur est identique à celle du début...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Bon j'ai contourné l'erreur en plaçant le composant dans le form de l'appli, lequel fait un LoadFromFile du fichier XML puis dans mon thread je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XMLDoc := Form1.XMLDoc;
    Pas très beau je pense mais ça marche....
    Enfin ça marche à moitié...
    J'ai un fichier xml du style
    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
    <AsRunLog>
      <EVP>
        <Chaine/>
        <IdChaine/>
        <DateDeDiffusion>14/05/2008</DateDeDiffusion>
        <HeureDeDiffusion>17:29:05</HeureDeDiffusion>
        <IdDiffusion>LOGO_DC_PLUS1_OFF</IdDiffusion>
        <Duree>00:00:01:00</Duree>
        <TCin>17:29:05:18</TCin>
        <TCout>17:29:05:18</TCout>
      </EVP>
      <EVP>
        <Chaine/>
        <IdChaine/>
        <DateDeDiffusion>14/05/2008</DateDeDiffusion>
        <HeureDeDiffusion>17:29:05</HeureDeDiffusion>
        <IdDiffusion>LOGO_HORLOGE_DC_OFF</IdDiffusion>
        <Duree>00:00:01:00</Duree>
        <TCin>17:29:05:18</TCin>
        <TCout>17:29:06:18</TCout>
      </EVP>
      <EVP>.....
    et mon fichier test.txt ne contient que le premier bloc EVP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ||14/05/2008|17:29:05|LOGO_DC_PLUS1_OFF|00:00:01:00|17:29:05:18|17:29:05:18
    que faut-il donc que je rajoute dans mon code pour qu'il parcours tous les nœuds du fichier ?
    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
        with XMLdoc.ChildNodes.Nodes['AsRunLog'].ChildNodes do
        begin
          with Nodes['EVP'].ChildNodes do
          begin
            tmpLine :=  tmpLine + Nodes['Chaine'].Text + '|';
            tmpLine :=  tmpLine + Nodes['IdChaine'].Text + '|';
            tmpLine :=  tmpLine + Nodes['DateDeDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['HeureDeDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['IdDiffusion'].Text + '|';
            tmpLine :=  tmpLine + Nodes['Duree'].Text + '|';
            tmpLine :=  tmpLine + Nodes['TCin'].Text + '|';
            tmpLine :=  tmpLine + Nodes['TCout'].Text;
          end;
          tmpFile.Add(tmpLine);
        end;
    Merci encore

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Bien sûr, CoInitialize dans l'initialization ne fonctionne que pour la tâche principale.

    Si tu fais du multi-tâche, tu dois placer ces deux lignes dans l'Execute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TTParserXml.Execute;
    begin
      CoInitialize(nil);
     
      while not Terminated do
        ReadXml(Source, Destination);
     
      CoUninitialize;
    end;

Discussions similaires

  1. lire fichier xml
    Par Alex35 dans le forum ASP
    Réponses: 5
    Dernier message: 14/02/2007, 12h13
  2. Lire fichier XML
    Par freestyler dans le forum Delphi
    Réponses: 14
    Dernier message: 26/09/2006, 11h56
  3. [XSLT] lire fichier XML
    Par julien14 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 07/07/2006, 12h16
  4. [SimpleXML] lire fichier xml
    Par ecoinfo dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2006, 20h22
  5. Lire fichier XML en java
    Par loop4 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 17/05/2006, 16h46

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