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

Langage Delphi Discussion :

Lecture de fichiers XML


Sujet :

Langage Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 254
    Points
    41 254
    Billets dans le blog
    63
    Par défaut Lecture de fichiers XML
    Toujours dans une tentative de lire des fichiers SVG pour remplir les chemins d'un TPath (cf https://delphi.developpez.com/telech...s-images-sympa) je tente d'ouvrir ce type de fichier via un XMLDocument

    Voilà le code actuel (note : memo1.lines.add( ) est remplacé par Path1.data.AddPath() dans le programme, mais comme il s'agit avant tout de la lecture du xml cela simplifie)
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Doc: IXMLDocument;
      Data: IXMLNode;
      Node, CNode: IXMLNode;
      I, J: Integer;
    begin
      Memo1.Lines.Clear;
      // Doc := LoadXMLDocument(Edit1.text);
      XMLDocument1.FileName:=Edit1.Text;
      XMLDocument1.Active:=True;
      Data := XMLDocument1.DocumentElement;
    // chercher attributes "viewbow"
      for I := 0 to Data.ChildNodes.Count-1 do
      begin
        Node := Data.ChildNodes[I];
        if SameText(Node.NodeName,'path')
          then memo1.lines.add(Node.Attributes['d']);
        if SameText(Node.NodeName,'g')
          then
            if Node.ChildNodes.Count>0 then
               begin
                 for J := 0 to Node.ChildNodes.Count-1 do
                  begin
                    CNode:=Node.ChildNodes[J];
                    if SameText(CNode.NodeName,'path') then
                       Memo1.Lines.Add(CNode.Attributes['d']);
                  end;
               end
               else memo1.Lines.Add(Node.Attributes['d']);
      end;
      XMLDocument1.Active:=False;
    end;
    1- j'ai tenté de m'affranchir du composant TXMLDocument mais certains fichiers (une fois n'est pas coutume, les plus simples, me lèvent une erreur) exemple fichier Android.svg
    Citation Envoyé par Erreur
    DTD interdite.

    Ligne: 1
    <?xml version="1.0" encoding="UTF-8"?><!
    Comment m'en sortir ou plutôt pourquoi j'ai cette erreur, le TXMLDocument fonctionnant pour les autres.

    2- j'ai des fichiers de structure plus complexe des noeuds g dans des noeuds g etc... est-il possible de s'en sortir dans ce cas ? exemple fichier portablejim-Chess-tile-Pawn.svg
    des idées ?

    À vrai dire c'est surtout le point 1 que j'aimerai éclaircir (les fichiers trop complexes je m'en passerai ) déjà qu'il y a l'attribut 'transform' avec la valeur "matrix= x x x x x x" qui m'interpelle pas mal
    (voir celtic-triskell-01.svg)
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 254
    Points
    41 254
    Billets dans le blog
    63
    Par défaut
    Point 1 avant de charger le document j'ai changé le DOMVendor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
      Memo1.Lines.Clear;
      DefaultDOMVendor:='Omni XML';               // changement de DOMVendor
      Doc := LoadXMLDocument(Edit1.text);     
      Data:=Doc.DocumentElement;
     
    //  XMLDocument1.FileName:=Edit1.Text;
    //  XMLDocument1.Active:=True;
    //  Data := XMLDocument1.DocumentElement;
    je vais maintenant surtout me consacrer à cette matrix qui me fait de l'œil car
    Nom : xml1.PNG
Affichages : 291
Taille : 15,0 Ko
    est loin d'être un triskell, bien sûr si j'enlève ce qui est en rouge j'ai
    Nom : XML2.PNG
Affichages : 283
Taille : 10,7 Ko
    ce qui est encore loin de
    Nom : Triskell.PNG
Affichages : 283
Taille : 25,6 Ko
    deux espoirs (matrix) restent transform="matrix(1.1303 0 0 1.1303 -1.0282 -.85104)" (à priori pour le cercle)
    transform="matrix(.95466 0 0 .95466 47.021 1.9294)" pour la "première branche" ?

    [Edit] une avancée en changeant simplement le comportement de TPath ,modifier la propriété wrapmode en fit
    et on obtient quelque chose de plus approchant
    Nom : xml3.PNG
Affichages : 271
Taille : 9,9 Ko

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 254
    Points
    41 254
    Billets dans le blog
    63
    Par défaut
    Pour indiquer où j'en suis : la piste "matrix" se refroidit un peu hélas

    Avec ce 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
     
    procedure TForm46.Button3Click(Sender: TObject);
    var aPath : TPathData;
        Matrix: TMatrixArray;
    begin
    // matrix(1.1303 0 0 1.1303 -1.0282 -.85104)
    APath:=TPathData.Create;
    Matrix[0]:=TVector.Create(1.1303, 0);
    Matrix[1]:=TVector.Create(0,1.1303);
    Matrix[2]:=TVector.Create(-1.0282, -0.85104);
     
    APath.Data:='m60.446 55.537a50.718 50.718 0 1 0 -101.44 0 50.718 50.718 0 1 0 101.44 0z';
     
    APath.ApplyMatrix(TMatrix(Matrix));
     
    Path1.Data.AddPath(APath);
    end;
    je pensais passer de l'image à un cercle, ce n'est pas le cas (en fait cela ne fait rien)
    cela étant je nage dans l'inconnu donc je ne sais si c'est la création de la matrice ou l'utilisation de celle-ci qui plante donc si quelqu'un qu'y si connait passe par là ... de mon côté pour cette partie je vais fouiller dans ce que j'ai pu trouver comme sources sur les SVG

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    pour le XML j'utilise mon unité qui permet d'extraire la structure et de l'interroger

    https://github.com/tothpaul/Delphi/tree/master/XML

    pas de doc, mais la procédure test montre assez bien les choses je pense
    https://github.com/tothpaul/Delphi/b...Tree.pas#L1112

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 254
    Points
    41 254
    Billets dans le blog
    63
    Par défaut
    Merci Paul,
    avant d'avoir lu ton post j'en étais rendu à cette version de ma procédure qui semble résoudre le point 2 et la structure complexe du fichier molumen_green_sitting_frog.svg
    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
     
    procedure TForm46.Button1Click(Sender: TObject);
    var
      Doc: IXMLDocument;
      Data: IXMLNode;
      Node, CNode: IXMLNode;
      I, J: Integer;
     
      procedure g(Node : IXMLNode);
      var j : integer;
          CNode : IXMLNode;
      begin
       for j:=0 to Node.ChildNodes.Count-1 do
         begin
          CNode:=Node.ChildNodes[j];
          if CNode.HasAttribute('d') then
               memo1.Lines.Add(CNode.Attributes['d'])
          else g(CNode);
         end;
      end;
     
    begin
      Memo1.Lines.Clear;
      DefaultDOMVendor:='Omni XML';
      Doc := LoadXMLDocument(Edit1.text);
      Data:=Doc.DocumentElement;
     
     if Data.HasAttribute('version') then
       if Data.Attributes['version']<>'1.1' then
         Showmessage('Attention Version = '+Data.Attributes['version']);
     
    {Todo : attributes "viewBox" pour obtenir le rectangle à prendre en compte ?
            obtenir les "transform" et gérer matrix
    }
    // if Data.HasAttribute('viewBox') then
    //   ???? ;
     
      for I := 0 to Data.ChildNodes.Count-1 do
      begin
        Node := Data.ChildNodes[I];
       if Node.HasAttribute('d')
          then  memo1.Lines.Add(Node.Attributes['d'])
          else g(Node);
      end;
      XMLDocument1.Active:=False;
    end;
    avec un petit peu de couleur c'est encore plus "parlant"
    Nom : XMLv2.PNG
Affichages : 273
Taille : 20,4 Ko
    Vous y remarquerez la limite de FMX.ObJects.TPath à propos de la couleur puisque celui-ci n'a qu'un remplissage "monochrome" (entre guillemets car il y a possibilité de dégradé et bitmap)
    voici l'original
    Nom : frog.PNG
Affichages : 276
Taille : 76,4 Ko
    Mais bon, faut pas pousser le bouchon, au départ mes tests d'utilisation se limitaient à un simple triangle

    [Edit] la procédure n'est pas encore au point deux de mes fichiers tests ( jhonny_automatic_geisha et portablejim-chess-tile-pawn) ne passent pas
    Citation Envoyé par erreur
    End tag g
    does not match the start tag g.

    Ligne: xxxxx >.
    une idée pour gérer ça ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 119
    Points : 41 254
    Points
    41 254
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    la procédure n'est pas encore au point deux de mes fichiers tests ( jhonny_automatic_geisha et portablejim-chess-tile-pawn) ne passent pas
    Erreur : End tag g does not match the start tag g.
    A priori cela vient du DOMVendor utilisé ! Du coup je me retrouve devant un gros dilemme, si je n'utilise pas DefaultDOMVendor:='Omni XML' je ne peux pas lire mes fichiers SVG les plus simples (android.dvg) récupérés sur http://materialdesignicons.com/ ou https://icones8.fr/icons, à contrario si je n'indique aucun DOMVendor j'arrive à lire ces fichiers plus complexe

    Comment faire pour allier les deux ?
    Utiliser DefaultDOMVendor:='ADOM XML v4'; (unité Xml.adomxmldom)

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

Discussions similaires

  1. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57
  2. Lecture de fichier XML généré avec SOAP
    Par Erkcy dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 09/01/2008, 22h22
  3. lecture de fichier xml
    Par cyreel dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/12/2006, 16h06
  4. [DOM4J] Problème de lecture de fichier xml avec dom4j
    Par santana2006 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/04/2006, 16h52
  5. VA lors de lecture du fichier XML
    Par LN(a) dans le forum Langage
    Réponses: 6
    Dernier message: 14/09/2005, 23h43

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