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 :

Relecture document XML erronée juste après la création


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut Relecture document XML erronée juste après la création
    Bonjour,

    J'ai ajouté un composant TXMLDocument sur ma form ainsi qu'un memo et deux boutons.
    Les options du XML sont : [doNodeAutoIndent,doAttrNull]

    Ensuite, je crée un document XML comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      nodeDoc,node : IXMLNode;
      S : UTF8string;
    Begin
      nodeDoc := Xml.AddChild('xml');
      node := nodeDoc.AddChild('Tag');  node.Attributes['item'] := 'Value1';
      node := nodeDoc.AddChild('Tag');  node.Attributes['item'] := 'Value2';
      node := nodeDoc.AddChild('Tag');  node.Attributes['item'] := 'Value3';
      Xml.SaveToXML(s);
      Memo1.Text := S;
    End;
    Ce qui donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xml>
      <Tag item="Value1"/>
      <Tag item="Value2"/>
      <Tag item="Value3"/>
    </xml>

    Ensuite, si je recharge le fichier par la procédure LoadFromFile, je peux en connaître les nœuds fils.

    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
     
    procedure TForm1.Button2Click(Sender: TObject);
    Var
      nodeDoc,node : IXMLNode;
      i : integer;
    begin
       xml.LoadFromFile('c:\temp\test.xml');
      nodeDoc := Xml.DocumentElement;
      ShowMessage(nodeDoc.LocalName+', '+IntToStr(Xml.DocumentElement.ChildNodes.count)+' éléments'); 
      for i := 0 to Xml.DocumentElement.ChildNodes.count-1 do
      Begin
        node := Xml.DocumentElement.GetChildNodes[i];
        ShowMessage(node.NodeName);
      End;
    end;
    Voici ce qu'on obtient en sortie :
    "xml, 3 éléments"
    "Tag"
    "Tag"
    "Tag"

    Ce qui est correct.

    PROBLÈME : si je n'appelle pas la procédure xml.loadFromFile, cela ne fonctionne pas, voici ce que j'obtiens :
    "xml, 10 éléments"
    "#text"
    "#text"
    "Tag"
    "#text"
    "#text"
    "Tag"
    "#text"
    "#text"
    "#Tag"
    "#text"

    Pourquoi le résultat est-il différent ? Pourquoi je lis des "#text" alors que je ne les lis pas lorsque je charge le fichier ?
    Si cela indique que le texte du tag est vide, pourquoi cela apparaît uniquement ici et pourquoi il y en a autant, puisqu'on ne peut avoir qu'un seul champ texte par tag non ?

    Bien sûr ce que je cherche c'est à ne pas passer par un fichier intermédiaire.
    Pour mon application, je souhaiterais pouvoir relire le fichier juste après avoir écrit dedans.
    Merci

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 336
    Points
    13 336
    Par défaut
    Tout est "nœud" dans un document XML, pas uniquement les balises <Tag>. Ajoute un commentaire <!--Comment--> et tu as un nouveau nœud de type ntComment.
    Avec <Tag>Texte</Tag>, tu auras un nœud de type ntElement et un sous-nœud de type ntText.

    Des nœuds #Text sont manifestement ajoutés systématiquement à cause de l'AutoIdent ! Quelque chose de pas clair la derrière, le parser semble s'emmêler les pinceaux...

  3. #3
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Oui, tu as raison Andnotor, c'est ce que je me suis rendu compte.
    Lors de la création d'éléments par la fonction AddChild, il ajoute effectivement d'autres nœud, ce qui n'est pas le cas lorsqu'on fait un LoadFromFile avec ce même document, d'où les différences.
    Donc par exemple, pour ajouter un item au 3ème tag, la solution que j'ai trouvé est que je balaie tous les noeuds et je compte le n ème noeud de type ntElement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      Function GetElementNum(Anode:IXMLNode;num:integer):IXMLNode;
      Var i,j : integer;
      Begin
        j := 0;
        result:=Anode.GetChildNodes[0];
        for i := 0 to Anode.ChildNodes.count-1 do
        if Anode.GetChildNodes[i].GetNodeType=ntElement then
        Begin
          inc(j);
          if j=num then result:=Anode.GetChildNodes[i];
        end;
      end;

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/08/2013, 16h09
  2. mot de passe expire juste après la création
    Par batou22003 dans le forum AIX
    Réponses: 0
    Dernier message: 07/11/2011, 10h23
  3. Réponses: 2
    Dernier message: 03/05/2007, 09h38
  4. Validation d'un document XML avant sa création??
    Par mardona dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 27/01/2006, 15h33
  5. [DOM XML][XSLT] Création d'un document XML avec PHP
    Par ToxiZz dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 16/01/2006, 17h44

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