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

Bases de données Delphi Discussion :

Importer fichier XML


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut Importer fichier XML
    Bonjour,

    Malgre la touche "F1" et mon pot "Google" je n'ai pas vu de solution a mon probleme.
    Je dois importer des Tickets au format XML :
    La partie "Article" ne me pose pas de probleme puisque je connais le nombre de ligne, je bute dans la partie "Encaissement"
    le nombres de lignes ne sont pas numerote :

    Voici la structure XML :

    Code XML : 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
    <?xml version="1.0"?>
    <ticket version="1" numero="10182" caisse="8">
       <entete>
          <creation>
             <date>07/06/2015</date>
             <heure>11:18:10</heure>
          </creation>
       </entete>
       <lignes nombre="4">
          <article numero="1" quantite="2.000" valeur="9.90">VIN DIVERS</article>
          <article numero="2" quantite="2.000" valeur="13.50">VIN DIVERS</article>
          <article numero="3" quantite="1.000" valeur="8.10">SODA</article>
          <article numero="4" quantite="1.000" valeur="8.10">SODA</article>
       </lignes>
       <bilan montantTTC="63.00">
          <tvas montantTaxes="8.64">
             <tva taux="20.00" base="46.80" nombre="4.000">7.80</tva>
             <tva taux="5.50" base="16.20" nombre="2.000">0.84</tva>
          </tvas>
          <encaissements montantEncaisse="63.00">
             <encaissement mode="ESPECES" nombre="1">11.00</encaissement>
             <encaissement mode="ESPECES" nombre="1">11.00</encaissement>
             <encaissement mode="CHEQUE" nombre="1">41.00</encaissement>
          </encaissements>
       </bilan>
    </ticket>
    /* je bute sur Ticket/Bilan/Encaissements */


    Voici mon code (qui ne pose aucun souci) pour recuperer les articles :

    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
       var
          Node: IXMLNode;
          n: Integer;
          designation, fiche, prix, qt, tva: string;
        begin
            XMLDoc.Active := False;
            XMLDoc.XML.Clear;
            XMLDoc.XML.Append(Memo1.Text); //Memo qui contient le XML
            XMLDoc.Active := True;
     
            Node := XMLDoc.ChildNodes.Nodes['ticket'].ChildNodes.Nodes['lignes'];
            for n := 0 to Node.ChildNodes.Count - 1 do
            begin
              code := Node.ChildNodes.Nodes[n].GetAttributeNS('code', '');
              qt := Node.ChildNodes.Nodes[n].GetAttributeNS('quantite', '');
              prix := Node.ChildNodes.Nodes[n].GetAttributeNS('valeur', '');
              tva := Node.ChildNodes.Nodes[n].GetAttributeNS('tva', '');
              designation := PremiereMajuscule(Node.ChildNodes.Nodes[n].Text);
              ... code .....
            end;
    ....
    Je vous remercie d'avance pour votre aide ou vos suggestions.

    Beau temps belle mer
    Jorgio

  2. #2
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    En fait, il ne faut pas utiliser le nombre de lignes ...
    Il faut définir une variable IXMLNode, puis prendre le premier enfant dans Node2 (par exemple) avec Node.ChildNodes.First.
    En gros il faut transformer comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var
      Node, Node2: IXMLNode;
    begin
      Node := XMLDoc.ChildNodes.Nodes['ticket'].ChildNodes.Nodes['lignes'].First;
      while Assigned(Node) do
      begin
     
        // Faire ce qu'on veut avec Node
     
       // PRendre le suivant de même niveau
        Node := Node.NextSibling;
      end;
    C'est juste l'idée .... à adapter dans ton cas.
    Mais prendre par rapport au nombre d'enfants n'est pas la bonne solution.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Bonjour papy,

    Je te remercie pour ton intervention hyper rapide, je n'ai pas reussi à mettre ta suggestion en route.
    Le XML ce n'est pas pour moi alors j'ai bidouille un bout de code qui n'est pas de moi j'ai rajoute "node.attributes" :

    Code dephi : 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
     
    uses
      ComObj, MSXML;
     
    procedure TFICHE.BitBtn2Click(Sender: TObject);
    var
      xml: IXMLDOMDocument;
      node: IXMLDomNode;
      nodes_row, nodes_se: IXMLDomNodeList;
      i, j, b: Integer;
    begin
      xml := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
      xml.async := False;
      xml.loadXML(Memo1.text); //load XML
     
      Memo2.Clear;
      nodes_row := xml.selectNodes('/ticket/lignes');
      for i := 0 to nodes_row.length - 1 do
      begin
        node := nodes_row.item[i];
        nodes_se := node.selectNodes('article');
        for j := 0 to nodes_se.length - 1 do
        begin
          node := nodes_se.item[j];
          Memo2.Lines.Add('Article=' + node.text); // Designation
          Memo2.Lines.Add('Quantite=' + node.attributes.item[1].text);
          Memo2.Lines.Add('valeur=' + node.attributes.item[2].text);
          Memo2.Lines.Add('tva=' + node.attributes.item[4].text);
          Memo2.Lines.Add('code=' + node.attributes.item[5].text);
        end;
      end;
     
      nodes_row := xml.selectNodes('/ticket/bilan/encaissements');
      for i := 0 to nodes_row.length - 1 do
      begin
        node := nodes_row.item[i];
        nodes_se := node.selectNodes('encaissement');
        for j := 0 to nodes_se.length - 1 do
        begin
          node := nodes_se.item[j];
          Memo2.Lines.Add('montant=' + node.text); // total
          Memo2.Lines.Add('mode=' + node.attributes.item[0].text); // mode de paiement
        end;
      end;
    end;

    J'ai mon resultat, par contre a savoir si c'est le bon moyen j'en sais que dalle

    Beau temps belle mer
    Jorgio

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 529
    Par défaut
    Exemple basé sur ton 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
    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
     
    uses XMLDoc, XMLIntf;
     
    procedure TForm3.Button1Click(Sender: TObject);
    var
      Xml: IXMLDocument;
      Node, NodeTicket, NodeEntete, NodeCreation, NodeLignes, NodeBilan, NodeEncaissements: IXMLNode;
    begin
      Xml := XmlDoc.LoadXMLDocument('C:\fichiers\ficforum.xml');
      NodeTicket := XML.DocumentElement;
     
      NodeEntete := NodeTicket.ChildNodes.First;
     
      NodeCreation := NodeEntete.ChildNodes.First;
      Node := NodeCreation.ChildNodes.First;
      while Assigned(Node) do
      begin
        Memo1.Lines.Add(Node.NodeName + ' = ' + Node.NodeValue);
        Node := Node.NextSibling;
      end;
      Memo1.Lines.Add('');
     
      NodeLignes := NodeEntete.NextSibling;
      Node := NodeLignes.ChildNodes.First;
      while Assigned(Node) do
      begin
        Memo1.Lines.Add(Node.NodeName + ' = ' + Node.NodeValue);
        Node := Node.NextSibling;
      end;
      Memo1.Lines.Add('');
     
      NodeBilan := NodeLignes.NextSibling;
     
      // On passe la TVA
      NodeEncaissements := NodeBilan.ChildNodes.First.NextSibling;
      Node := NodeEncaissements.ChildNodes.First;
      while Assigned(Node) do
      begin
        Memo1.Lines.Add(Node.NodeName + ' = ' + Node.NodeValue);
        Node := Node.NextSibling;
      end;
      Memo1.Lines.Add('');
     
      Xml := nil;
    end;

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 8
    Par défaut
    Re,

    Papy c'est carrément du clé en main ton intervention
    Je te remercie de l’intérêt que tu as porté à mon problème.

    Beau temps belle mer
    Jorgio

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

Discussions similaires

  1. important fichier XML+ code Java
    Par nonna dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 09/02/2008, 13h09
  2. Réponses: 3
    Dernier message: 20/04/2007, 09h46
  3. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/04/2007, 14h35
  4. VBScript : création base Access pour import fichier XML
    Par abertaud dans le forum VBScript
    Réponses: 1
    Dernier message: 02/04/2007, 14h34
  5. Importation fichier xml
    Par kastor_lapon dans le forum WinDev
    Réponses: 1
    Dernier message: 01/07/2005, 11h54

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