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 :

XML:Piège classique avec le XML: éclarer en IXMLDocument et non TXMLDocument


Sujet :

Delphi

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 343
    Points : 536
    Points
    536
    Billets dans le blog
    2
    Par défaut XML:Piège classique avec le XML: éclarer en IXMLDocument et non TXMLDocument
    Piège classique avec le XML: déclarer en IXMLDocument et non TXMLDocument

    Supprimer ce fil.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Autre astuce créer un TComponent factice qui sert de Owner de TXMLDocument ce qui change le comportement, cela le rapproche de la gestion mémoire avec une variable IXMLDocument qui fournit le compteur de référence.

    Mette un Owner au TXMLDocument, évite la belle erreur à la libération ou sinon tu faut appeler explicitement ClearDocumentRef avec le Free
    D'ailleurs le TXMLDocument avec Owner est plus stable dans sa gestion des références de ses interfaces qu'avec nil ... en D7 ... cela du changer, je pense au XPath où les noeuds sont libérés à peine récupérer.

    Rien de neuf en somme !

    Citation Envoyé par ShaiLeTroll Voir le message
    Je vois que l'on utilise FindNode avec un Constructeur Fichier, je poursuis ce que disais Andnotor sur la VA et bizarrie de libération, interface ...

    C'est effectivement pénible la gestion particulière avec le Owner et sans le Owner ...

    Sans Owner, on peut faire pour éviter la VA

    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
    var
      Doc :TXMLDocument;
    
    begin
      Doc := TXMLDocument.Create(nil);
      try
        Doc.LoadFromFile(aFileName);
        ...
      finally
         if Assigned(Node) then 
           (Doc.Node as IXMLNodeAccess).ClearDocumentRef();
         Doc.Free;
      end;
      
    end;
    Mais sabs Owner, la gestion des compteurs de références des interfaces c'est juste une misère ...

    en particulier avec FindNode qui perd ses références , comme j'ai des objets XML construit dynamiquement sans Form ... j'ai fait dans le tordu ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        XMLDoc := TXMLDocument.Create(TComponent.Create(nil)); // Le Owner stabilise les interfaces IXMLNode libéré à tord et à travers !
        try
          ...
        finally
          XMLDoc.Owner.Free();
        end;

    Tu devrais réorganiser ton code et découper la lecture de chaque node en sous-fonction qui s'appelle mutuellement et remplisse le DataSet ...

    Sinon le XML cela peut-être récursif, pour certaines des applis dont j'ai la maintenance en charge c'est ce qui se passe, une fois parti sur IXMLNode ou sur IXMLNodeList, il n'y a aucun soucis de parcours même pour les noeuds au nom similaire (je serais embêté sinon) ... je suis étonné de l'utilisation de NextSibling (basé sur FindSibling) qui est plus lent qu'un For ChildNodes ... as-tu eu des problèmes avec Count ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. [XL-2016] Fonction RECHERCHEV avec valeur si non trouvé
    Par retraite83 dans le forum Excel
    Réponses: 2
    Dernier message: 16/03/2019, 18h30
  2. [2.x] Mail avec template twig non trouvé
    Par KLeMiX dans le forum Symfony
    Réponses: 1
    Dernier message: 16/04/2013, 00h12
  3. Problème de serialization policy file non trouvé
    Par hugo123 dans le forum GWT et Vaadin
    Réponses: 2
    Dernier message: 23/07/2009, 11h09
  4. Problème avec mon contrôleur non trouvé
    Par frantz68 dans le forum MVC
    Réponses: 10
    Dernier message: 08/06/2009, 10h54
  5. Perl + XML : problème de '-' avec XML::Simple
    Par rico29600 dans le forum Modules
    Réponses: 6
    Dernier message: 17/07/2007, 14h50

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