[DotNet 2.0]Ecriture de fichier XML, performances ?

Je suis en train d’écrire un petit Syslog qui capture des messages sur le réseau et les stocke dans un fichier XML.

Pour ca j’utilise la classe XmlDocument et sa méthode Save (monfichier) et je fais un fichier dans le style :

<messages> <message> <priority>13</priority> <timestamp>11/10/2005 11:23:45</timestamp> <hostname>mymachine</hostname> <tag>su</tag> <content>jkhdsfjhkjhjkhhfds</content> <message> <message> <priority>13</priority> <timestamp>11/10/2005 11:23:45</timestamp> <hostname>mymachine</hostname> <tag>su</tag> <content>jkhdsfjhkjhjkhhfds</content> <message> </messages>

Le problème c’est que le XmlDocument conserve en mémoire les nodes. J’ai donc une utilisation mémoire qui grossit sans cesse.

Je voudrais faire un “append” et ne conserver en mémoire des nodes que dans l’attente d’une écriture sur le disque (des que c’est ecrit, hop, on vire). Pour ca j’ai tenté le XmlTextWriter mais il me pose également problème. Je n’arrive pas à lui faire écrire un node dans le node racine, je sais juste le mettre au bout, ce qui n’est pas top.

En gros j’ai besoin d’une méthode me permettant d’intégrer un node dans un fichier xml sans pour autant charger celui-ci entièrement.

Je suppose que ca doit être faisable. help.

Merci d’avance.

Tu ouvres le doc, tu selectionne le bon node, et tu ecris apres avec ton XmlWriter, je vois pas exactement ou tu as le probleme :stuck_out_tongue: La je suis sur le mac donc je peux pas te mettre le code… cherche un peu, t’es pas loin, si tu trouves pas je te mettrais si je peux du code lundi.

La seule solution que j’ai trouvé pour me positionner dans le xml c’est de me mettre à la fin du fichier et de faire un Seek pour me placer devant “” ensuite l’écraser avec un (ou des) nouveau(x) node(s) et réecrire pour finir . mais ca me semble douteux.

J’ai essayé de me positionner avec le XmlTextReader mais pas moyen de récuperer un Stream.

+1 j’ai exactement le même problème, ca me prend une place dingue en mémoire et j’ai pas trouvé l’équivalent d’un “flush”

Je me sens moins seul :stuck_out_tongue:

Là, j’ai réussi à append des nodes dans le root avec la méthode d’au dessus.
Je vais au bout du fichier puis je recule le pointeur de la taille de mon dernier tag (un truc genre : writer.Basestream.seek(-11, seekorigin.end))
Ensuite j’écris mes nodes et je finis par réécrire le tag (writer.Basestream.write(Encoding.utf8.getbytes("" …)

Ca marche tant qu’on ne va rien mettre après .

C’est du sytème D donc s’il y a quelque chose de plus propre, je suis preneur.