Bonjour,
Voilà sur ma version de delphi (7) le composant TXMLDocument n'existe pas. N'ayant rien touvé sur le net, je suis en train de développer un composant qui pourrait accomplir au moins les fonctions basique sur le XML : Lecture, écriture, existence d'un noeud etc...
Pour l'instant j'arrive plus ou moins à savoir si un noeud existe ou pas. Mais ma fonction (je le sais bien) est très mal developpé. Ca fait plusieurs jours que je planche dessus, mais j'arrive pas à avancer. Alors si vous avez des idées des suggestions, des pistes.. je suis preneur.
Explications de la fonction :
Je pars du principe que le fichier XML trace une arborescence comme dans l'explorateur et par conséquence on peut la nommer de la même façon avec un chemin ou chaque balise serait séparé par des '\'.
Pour éviter d'alourdir mon post je ne mettrais pas les fonctions annexes, juste une petite explication sur celles-ci:
LireFichierTexte : Renvoie un TStringList contenant le fichier XML dans son entier
fFichierXML : Propriété du composant (que je suis en train de developpe) qui contient sous la forme d'un String le chemin du fichier XML
DecomposeChemin : Met dans un TStringList (Ligne/ligne) les balises recontré dans le chemin.
Contienttexte: C'est juste une encapsulation de la fonction PosEx pour qu'elle renvoie un booleen.
Function TJTXML.ExisteNode (Chemin:String): Boolean;
Var Temp:TStringList; {Sera utiliser pour charger le fichier XML en mémoire}
Balises : TStringList; {Va servir à stocker le chemin élément par élément}
i,j,l,m: Integer; {l : Début intervalle du Node courant
m : Fin Intervalle du Node courant
i et j sont de variable pour les boucles FOR}
Trouve: Boolean; {Indiquera si on a trouvé le commencement du Node courant
Vérification qui est utile si le fichier contient une
erreur et qu'il y a la balise de fin sans la balise de
début!}
begin
Try
Try
Result:= False; //Initialisation du résultat
if notFileExists(fFichierXML) then Exit; {Ca risque pas d'exister !}
{Chargement et traitement du fichier}
Temp := LireFichierTexte(fFichierXML);
{Découpage du chemin}
Balises:=DecomposeChemin(Chemin);
l:=0; m:=Temp.Count-1;{Positionnement de Départ}
For j:=0 to Balises.Count -1 do
begin
{Recherche du 1er Node ensuite à l'intérieur de cette intervalle délimité
par celui-ci on cherche le deuxième Node etc... A la fin on vérifie que
c'est le dernier et si il est trouvé, c'est que le chemin existe sinon il
a été positionné à False au début de la procédure }
Trouve:=False;
For i:=l to m do
begin
if ContientTexte (LowerCase (Temp.Strings[i]),LowerCase ('<'+Balises.Strings [j]+'>')) then
begin
Trouve:=True; l:=i; //Position de la balise nième
end;
if (Trouve and ContientTexte (LowerCase (Temp.Strings[i]),LowerCase ('</'+Balises.Strings [j]+'>'))) then
begin
if j=Balises.Count-1 then Result:=True; {Si c'est la dernière tout est trouvé et on va s'arrêter là}
m:=i;Break; //Position de la fermeture de la balise nième
end;
end;
If not Trouve then Break; {Si la néime balise n'a pas été trouvé ne pas
chercher la n+1 !}
end; //End du For j
Except
Result:= False;
end;
Finally
Temp.free; Balises.free; //Libération des TStringList
end;
end;
Merci d'avance de votre aide.
fjohnny