Relecture de nodes XML juste aprés insertion

Messages postés
184
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010
- - Dernière réponse : cs_jfs59
Messages postés
184
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010
- 25 janv. 2010 à 20:25
Bonjour,

voila mon problème .. j'ai un fichier xml de configuration dans le quel je rajoute des éléments par ce code :

procedure TListEdit.BitBtn2Click(Sender: TObject);
Var Categorie, Systeme, nom , code : IXMLNode;
begin
with form1.ConfigXML.ChildNodes.Nodes['Configuration'].ChildNodes do
with Nodes['Systemes'] do Systeme := AddChild('Systeme');
Nom := Systeme.AddChild('Nom');
Nom.Text := LabeledEditSyst.Text;
Code := Systeme.AddChild('Code');
Code.Text := LabeledEditSystCode.Text ;
Form1.EtiqXML.SaveToFile(ExtractFilePath(application.ExeName) + 'Config\cfg.xml');
end;


puis je l'affiche par ce code:

for i := 0 to stringgrid1.rowcount-1 do stringgrid1.rows[i].clear;
stringgrid1.RowCount := 1 ;
stringgrid1.Cells[0, 0] := 'SYSTEMES';
stringgrid1.Cells[1, 0] := 'CODES';
with form1.ConfigXML.ChildNodes.Nodes['Configuration'].ChildNodes do
with Nodes['Systemes'].ChildNodes do
begin
for x := 0 to count - 1 do
begin
stringgrid1.RowCount := stringgrid1.RowCount + 1 ;
stringgrid1.Cells[0, x + 1] := GetNode(x).ChildNodes.Nodes['Nom'].Text;
stringgrid1.Cells[1, x + 1] := GetNode(x).ChildNodes.Nodes['Code'].Text;
end;
end;
stringgrid1.fixedrows := 1 ;


si je ne ferme pas le programme j'ai une exception

This operation cannot be performed with a node of type PCDATA


j'ai mis des traceurs ! mon count augmente de 3 au lieu de 1
si je ferme le programme et ouvre ca marche !
j'ai inspecté le fichier XML tout est normal

j'ai essayé ce code :

for i := 0 to stringgrid1.rowcount-1 do stringgrid1.rows[i].clear;
X:= 1;
stringgrid1.RowCount := 1 ;
stringgrid1.Cells[0, 0] := 'SYSTEMES';
stringgrid1.Cells[1, 0] := 'CODES';
with form1.ConfigXML.ChildNodes.Nodes['Configuration'].ChildNodes do
with Nodes['Systemes'].ChildNodes do
Syst := First;
if assigned(Syst) then
repeat
stringgrid1.RowCount := stringgrid1.RowCount + 1 ;
stringgrid1.Cells[0, x ] := inttostr(x);
stringgrid1.Cells[0, x ] := Syst.ChildNodes.Nodes['Nom'].Text;
stringgrid1.Cells[1, x ] := Syst.ChildNodes.Nodes['Code'].Text;
x := x+1;
Syst := Syst.NextSibling;
until not assigned(Syst);
stringgrid1.fixedrows := 1 ;


Idem

j'ai essayé refresh et resync sur le xml

j'ai passé la propriété active du XML a true et/ ou false

je deviens chèvre ... Béééééhhhhhh

le probleme je suis sur c'est l'increment du count a 3 au lieu de 1 !

mais ou j'ai commis l'erreur ... et quelle erreur puisque le XML est nickel et se relis si je ferme le prog !


Merci de la moindre piste ....
Afficher la suite 

5 réponses

Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
j'ai deja eu le probleme, mais je ne sais plus exactement comment je l'ai corrigé.
Si tu fais du pas à pas sur le nodename de chaque sibbling, tu verra des noeuds dont le nom est '#', qui se sont inserés entre chacun de tes noeuds.
Je crois que tu peux le corriger en enlevant (ou ajoutant ?) poPreserveWhiteSpace des ParseOptions du XMLDocument. Je ne suis pas sur que ce soit ca, mais il me semble que c'est un probleme a cause des espaces qu'il convertit en noeuds (ou peut etre que ca se corrige en changeant le DOMVendor ou un truc dans le genre).
Commenter la réponse de Guillemouze
Messages postés
184
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010
0
Merci
Je crois que tu peux le corriger en enlevant (ou ajoutant ?) poPreserveWhiteSpace des ParseOptions du XMLDocument.



J'ai fais ... c'est pire la le xml ne se lis plus en aucune circonstance ... erreur partout !

merci ... mais la solution n'est pas efficace ... une piste cependant puisque la l'erreur devient systématique ....

Cordialement jfs.



[i]
Tout est en tout et réciproquement .../i
Commenter la réponse de cs_jfs59
Messages postés
184
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010
0
Merci
Up

toujours pas trouvé une solution .. même pas le début d'une piste ...

merci


Cordialement jfs.

PS: Je ne donne pas de réponse en mp sur des questions de programmation.   !
merci ...
Tout est en tout et réciproquement ...
Commenter la réponse de cs_jfs59
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
4
0
Merci
as tu essayé un truc dans le genre
with Nodes['Systemes'].ChildNodes do
begin
  for x := 0 to count - 1 do
  begin
    if GetNode(x).NodeName <> '' then
    begin
      stringgrid1.RowCount := stringgrid1.RowCount + 1 ;
      stringgrid1.Cells[0, x + 1] := GetNode(x).ChildNodes.Nodes['Nom'].Text;
      stringgrid1.Cells[1, x + 1] := GetNode(x).ChildNodes.Nodes['Code'].Text;
    end;
  end;
end; 

essaye de voir la difference entre tes "vrais" noeud et ceux rajoutés automatiquement (nodename, nodetype, ...) pour pouvoir ignorer ceux qui genent
Commenter la réponse de Guillemouze
Messages postés
184
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010
0
Merci
bonsoir et merci ..

alors le code provoque lui aussi la même exception !

j'ai fais ca et ca marche

form1.ConfigXML.SaveToFile(ExtractFilePath(application.ExeName) + 'Config\cfg.xml');
     form1.ConfigXML.XML.Clear;
     form1.ConfigXML.loadfromFile(ExtractFilePath(application.ExeName) + 'Config\cfg.xml');

     end;


a noter que resynch refresh et rechargement simple sont inefficaces ....

j'ai une solution .. peu satisfaisantes .. mais une solution

je cherche donc a remplacer les deux lignes par une seule plus propre ayant le même effet

merci

Cordialement jfs.

PS: Je ne donne pas de réponse en mp sur des questions de programmation.   !
merci ...
Tout est en tout et réciproquement ...
Commenter la réponse de cs_jfs59