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 :

XML Serializer/Marshaller en Delphi 10


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Ingénieur développement logiciel
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut XML Serializer/Marshaller en Delphi 10
    Bonjour à tous,

    Je cherche depuis quelques temps un outil de sérialisation XML à l'instar de la classe system.xml.serialization.xmlserializer en .Net

    Embarcadero a fait un travail remarquable avec REST.Json et REST.Json.Types pour sérialiser les retours d'API en objets mais je n'ai rien trouvé pour le XML

    J'ai eu un élan d'espoir avec les travaux de Robert Love et son PoC en 2010 mais depuis plus rien, comme si XML étant un langage abandonné.

    Un autre projet avait retenu mon attention Delphi-Serialization mais le projet est assez ancien, dépend de Spring4D (en pleine refactorisation) et DSharp (qui a l'air de prendre la poussière) et seulement 2 annotations sont disponibles (renommer le nom de l'élément et le définir comme nullable) alors que le XML a plus d'options (l'élément est un attribut, un texte, appartient à un namespace...)

    J'ai regardé du côté de awesome-delphi mais là aussi la sérialisation concerne le JSON et pas le XML...

    J'ai aussi tenté d'utiliser des librairies payantes mais ça reste très sommaire dans ce domaine, soit on a une sérialisation limitée à un format compatible avec une DBGrid (Aurelius, TMS, kbmMW...) soit on a très peu d'exemple et/ou de documentation (NG.Serialization.Xml de LMD).

    J'ai cherché sur ce forum et je suis tombé sur le sondage Utilisez vous les RTTI et certains parlent de leur travail mais je n'ai pas trouvé de suite.

    J'ai commencé à travailler sur un fork en me basant sur les 2 projets github mais si quelqu'un a d'autres pistes je suis preneur !

  2. #2
    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 : 54
    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 448
    Points
    28 448
    Par défaut
    le problème principal qu'on rencontre sur la sérialisation XML c'est que tu peux avoir des attributs et des enfants...et c'est assez pénible à organiser en data.

    j'utilise cependant une unité de mon cru qui marche plutôt pas mal sur mes cas d'usage (non exhaustifs)

    voici ce que ça donne au niveau syntaxe

    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
     
    type
      TXMLNodeText  = type string;
      TXMLTextValue = type string;
      TXMLUtf8Value = type UTF8String;
      TXMLBoolValue = type Boolean;
      TXMLIntValue  = type Integer;
      TXMLInt64Value  = type Int64;
      TXMLCurrValue = type Currency;
      TXMLDateValue = type TDateTime;
     
    {
      <node id="123">Value</node>
    }
      TNode = record
        id: Integer; // c'est un attribut
        Value: TXMLNodeText; // indique que Value est le contenu du noeud, ce n'est donc ni un attribut, ni un enfant
      end;
     
    {
      <node id="1">
        <bool>true</bool>
        <int>1</int>
        <text>text</text>
        <curr>1.5</curr>
        <date>2020-10-31T12:48:00Z</date>
      </node>
    }
      node = record
        id  : Integer;
        bool: TXMLBoolValue; // noeud contenant un boolean
        int : TXMLIntValue; // noeud contenant un integer
        text: TXMLTextValue; // noeud contenant du text
        curr: TXMLCurrValue; // noeud contenant un montant
        date: TXMLDateValue; // noeud contenant une date
      end;
     
    {
       <tns:node xml:tns="http://exemple.com" tns:type="type"/>
    }
       [TXMLNamespace('http://exemple.com')] // précise le namespace
       TNode = record
         [TXMLName('type')] // alias du noeud (pourrait être &type)
         type_: string;
       end;
    les enfants de noeud peuvent être dans des TArray<T> au besoin.

    c'est un travail que j'ai mené dans la même idée que Execute.JSON avec Execute.XML.Tree pour la lecture et Execute.RTTI pour identier les records

    par contre j'ai surtout travaillé la lecture du XML vers des Records, pour construire le XML je préfère utiliser des fonctions comme

    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
     
    function xmlTag(const Name, Params, Value: UTF8String): UTF8String;
    begin
      Result := '<' + Name;
      if Params <> '' then
        Result := Result + ' ' + Params;
      if Value <> '' then
        Result := Result + '>' + Value + '</' + Name + '>'
      else
        Result := Result + '/>';
    end;
     
    begin
      xml := xmlTag('parent', 'id="123"', 
        xmlTag('child', '', 'value')
      + xmlTag('child', '', 'value')
      );
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre à l'essai
    Profil pro
    Ingénieur développement logiciel
    Inscrit en
    Janvier 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse, ça ressemble aux morceaux de code que j'ai pu voir sur différents dépôts ou forums.

    Une partie de la problématique c'est que j'ai un format de base et une structure différente en fonction du type de message. Je voudrais donc utiliser des classes pour ne pas avoir à dupliquer les fields communs à chaque fois.

    On me dira que mes éléments sont définis dans un fichier XSD donc je peux me contenter d'utiliser l'assistant XML Binding de Delphi et le tour est joué

    Une autre partie est que, discutant avec une API web et un message Broker, je dois pouvoir lire ET écrire du XML à partir d'objets et je trouve dommage de devoir refaire le travail alors qu'on a déjà fait une partie du travail.

    J'ai conscience que le XML est plus complexe que le JSON mais j'aurais espéré une solution plus élégante que de devoir générer soi-même un string.

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/04/2008, 13h51
  2. [SAX] [Debutant]package org.apache.xml.serialize
    Par Ashgenesis dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 25/01/2008, 09h31
  3. XML.Serialize : pb avec les booléan
    Par MayOL69bg dans le forum Windows Forms
    Réponses: 6
    Dernier message: 14/11/2007, 10h26
  4. Marshal en Delphi
    Par manel77 dans le forum Delphi .NET
    Réponses: 0
    Dernier message: 27/07/2007, 08h30
  5. [XML Serializer] Comment enlever les propriétés vides ?
    Par BillGates12345 dans le forum EDI/Outils
    Réponses: 5
    Dernier message: 02/08/2006, 10h49

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