En fait j'utilise déjà la fonction GetAttributeNS mais pour cela il faut déjà trouver le noeud et c'est là que c'est consommateur de temps.
Voici ma fonction actuelle qui prend trop de temps:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Function TMyXML.Read(Path,item, default: String): String;
Var
S : string;
node: IXMLNode;
P : integer;
Begin
result := Default;
delete(path,1,4); // le chemin commence toujours par "xml/"
p:=1;
node:=Xml.DocumentElement;
while (node <> nil) and (P > 0) do
Begin
P := Pos('/', Path);
if (P > 0) then
Begin
S := Copy(Path, 1, P - 1);
delete(Path, 1, P);
node := node.ChildNodes.FindNode(S); // Si ce n'est pas le dernière identifiant alors c'est un noeud
End;
End;
if assigned(node) and (node.HasAttribute(item)) then result := node.GetAttributeNS(item, '');
End; |
Je l'appelle de cette manière:
S := Read('xml/regulator/protocol/','readformat','ERR');
et S contient donc: "<MSG><CR><LF>"
Ça marche nickel, mais pour des gros fichiers, cela prend beaucoup de temps, j'ai donc créé ma fonction pour remplir un TStringList et ensuite je fais un indexof pour retrouver un identifiant, ce qui est beaucoup plus rapide (environ 10 fois plus rapide).
Le problème est ce codage particulier qui est utilisé pour certains caractères.
Partager