Forum Programmation.python Écrire du XML en série, sans stockage intégral en mémoire

Posté par  (site web personnel) .
Étiquettes : aucune
0
6
juil.
2010
Bonjour,

Je vais coder un outil qui fera des modifications légères dans des fichiers OpenDocument, à savoir : changer quelques attributs href dans des balises.

En bon unixien, pour un tel traitement, je pense tout de suite à une lecture au fur et à mesure, une modification et une écriture à la volée : pas question de tout charger en mémoire, ça n'apporterait rien sinon une plus grande consommation de ressources. Sauf que c'est du XML, et que ça ne se traite certainement pas ligne par ligne, mais plutôt balise par balise.

Techniquement, rien ne s'oppose à un tel traitement à la volée. La lecture au fur et à mesure peut se faire avec un parseur SAX. Mais qu'en est-il de l'écriture ? J'ai l'impression qu'il n'existe tout simplement rien pour écrire du XML à la volée sans le stocker intégralement en mémoire. Sauriez-vous si je me trompe, et si en fait, ça existe, bien sûr ?

J'ai bien une solution de secours, qui consiste à lancer xmlstarlet pyx, pour convertir ce XML en PYX, un format équivalent orienté lignes, puis à traiter ligne par ligne, et à ressortir xmlstarlet pour en refaire du XML. Mais ça me dégoûte un peu de devoir lancer un processus pour cela alors que je pourrais ne pas quitter Python.
  • # Solution simple

    Posté par  . Évalué à 3.

    print("\t<balise attribut=\"truc\">super")

    Simple et efficace.

    Envoyé depuis mon lapin.

  • # StAX

    Posté par  . Évalué à 1.

    Cherche avec ton moteur préféré: à la base c'est une spec java avec une implémentation de référence développée par Sun.
    Je n'ai pas vu d'implémentation dans un autre langage à l'époque où j'en avais besoin, donc j'ai tenté une implémentation en C que je n'ai jamais terminée (juste un truc très limité qui satisfaisait mes besoins). Ca a peut-être évolué depuis.
    Si tu tombes sur des trucs intéressants, merci de les partager ici.
    • [^] # Re: StAX

      Posté par  . Évalué à 3.

      pas pu m'empêcher de fouiller: http://stax.codehaus.org/Home
      • [^] # Re: StAX

        Posté par  . Évalué à 2.

        et j'aurai du me forcer à lire dans quels forum tu postais ...
        donc en python, non je ne sais pas désolé ...

        AUTOFAIL ! ~~~~~> []
  • # Trouvé

    Posté par  (site web personnel) . Évalué à 3.

    C'est bon, j'ai trouvé une solution : sous-classer xml.sax.saxutils.XMLGenerator.

    En regardant leur code source, on s'aperçoit que c'est une bête classe de fonctions de rappel SAX qui, à chaque « événement », écrit tout simplement le code XML correspondant.

    Donc je sous-classe, et à chaque événement, je modifie ce que j'ai à modifier, puis j'appelle la méthode parente.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.