Nous sommes le Dim 20 Juil, 2025 13:59
Supprimer les cookies

Page 1 sur 21, 2 Suivantgénérer un fichier xml à partir d'un tableau

Sur le logiciel libre en général ou un logiciel libre en particulier

Mar 12 Juin, 2007 13:05

Bonjour à tous,

quelqu'un pourrait-il me dire comment et avec quels softs faire ceci :
j'ai un tableau OOo dont je veux extraire les données en xml pour faire ce type de ligne de temps.
Mon tableau est très simple, il comporte quatre colonnes dont les éléments pour chaque ligne doivent être les attributs d'une balise xml.
Le tableau :
Code: Tout sélectionner
TitreColonne1 | TitreColonne2 | TitreColonne3 | TitreColonne4
  ValeurA1        ValeurA2        ValeurA3        ValeurA4         
  ValeurB1        ValeurB2        ValeurB3        ValeurB4         
  ValeurC1        ValeurC2        ValeurC3        ValeurC4         
etc...

Le fichier xml sera de ce type :

Code: Tout sélectionner
<data>
    <event TitreColonne1=valeurA1 TitreColonne2=valeurA2 TitreColonne3=valeurA3>
    valeurA4
    </event>

    <event TitreColonne1=valeurB1 TitreColonne2=valeurB2 TitreColonne3=valeurB3>
    valeurB4
    </event>
    etc...
</data>

merci.
damj

Messages : 626

Mer 13 Juin, 2007 09:04

Plutôt un bricolage qu'une vraie solution, mais je me souviens d'avoir eu le même problème avec un tableau. A l'époque j'avais tout simplement recopié toutes mes valeurs dans une seule et même cellulle, ligne par ligne dans une autre feuille et j'avais inséré le texte XML. Il m'avait suffi ensuite d'exporter le tout au format CSV, d'éliminer de manière automatique au sein de l'éditeur de texte les virgules et point-virgules, puis de sauvegarder le tout au format XML en ajoutant l'en-tête. Coté formule, cela donnait ceci :

Code: Tout sélectionner
="<collegiale id='"&Feuille1.A727&"' vocable='"&Feuille1.E727&"'><fondation deb='"&Feuille1.B727&"' type='' fin=''/><diocese localite='"&Feuille1.C727&"' code=''>"&Feuille1.G727&"</diocese><fondateur date=''>"&Feuille1.H727&"</fondateur><etat deb='' fin=''>"&Feuille1.I727&"</etat><prebende deb='' fin='' nb='"&Feuille1.J727&"'/><patron date=''>"&Feuille1.K727&"</patron><collat date=''>"&Feuille1.L727&"</collat><disp deb='' fin='' raison='"&Feuille1.M727&"'/></collegiale>"


Ce n'est pas ce qu'il y a de plus simple. Il y a sûrement plus efficace mais personnellement cela m'avait bien dépanné.
Tux, il a eu ton âme... Il aura ta femme !

Hadopi Hadoptée ? Et Haprès ?
kaneda_aka_tetsuoka

Avatar de l’utilisateur
Messages : 1749
Géo : Lille

Mer 13 Juin, 2007 11:04

Ouais, merci pour ta réponse, c'est plus ou moins ce que j'ai fait pour l'instant (peut-être en un peu moins bricolé même :wink: ) mais c'est vrai que si j'avais une solution un peu moins laborieuse ça m'arrangerait...
damj

Messages : 626

Mer 13 Juin, 2007 11:04

Bonjour,
J'ai fait un petit programme python, j'espère que ca vous conviendra :D
Le code est pas très beau (Fait en vitesse juste avant de retourner en cours ^^), mais normalement ca reste fonctionnel.

Pour l'utiliser, il faut d'abord convertir les données openoffice en format csv (enregistrer sous > format csv il me semble)
Il faut bien sur python installé, et normalement les librairies utilisées sont intégrées par défaut. Il suffit ensuite de copier coller le code suivant dans un fichier avec l'extension .py et il n'y a plus qu'à exécuter ! Le programme demandera le fichier csv d'entrée, et le fichier xml à créer.



Code: Tout sélectionner
# -*- coding: cp1252 -*-
import os
import csv
from xml.dom.minidom import Document

fichiercsv = raw_input("Entrer le nom du fichier csv à traiter :")

#Ouverture du fichier csv
if (os.path.isfile(fichiercsv)==1):
    donnees = csv.reader(open(fichiercsv,"rb"))
else:
    print "Le fichier %s est introuvable." % (fichiercsv)


doc = Document()

racine = doc.createElement("data")
index = 0

for row in donnees:
    if index == 0:
        TitreColonne1 = row[0]
        TitreColonne2 = row[1]
        TitreColonne3 = row[2]
    else:
        doc.appendChild(racine)
        element = doc.createElement("event")
        element.setAttribute(TitreColonne1, row[0])
        element.setAttribute(TitreColonne2, row[1])
        element.setAttribute(TitreColonne3, row[2])
        racine.appendChild(element)
        texte = doc.createTextNode(row[3])
        element.appendChild(texte)
    index = index + 1

#print doc.toprettyxml()
fichierxml = raw_input("Entrer le nom du fichier xml à créer :")
fichier = open(fichierxml,'w')
for ligne in doc.toprettyxml():
    fichier.write(ligne)
fichier.close()
Sador

Messages : 28

Mer 13 Juin, 2007 11:07

Merci, je vais regarder ça !
J'aurai peut-être quelques questions...
damj

Messages : 626

Mer 13 Juin, 2007 11:14

Bonjour,

A peu près la même chose mais en perl ( en n'utilisant que des fonctions usuelles, pas de trucs xml ... )

A copier-coller dans un fichier traite.pl ( par exemple )
Code: Tout sélectionner
#!c:\perl\bin\perl.exe

my $cptLigne = 0;
my @tabEntete;
my @valCourante;

open FICH , $ARGV[0];

print "<data>\n";
while ( <FICH> ) {
   chomp( $_ );
   if ( $cptLigne == 0 ) {            
      @tabEntete = split ( /:/ );
      if ( $tabEntete[0] ne "" ) {
         $cptLigne++;
      }
   } else {
      @valCourante = split ( /:/ );
      print "<event";
      foreach $entete ( @tabEntete ) {
         print " ".$entete . "=" . pop( @valCourante );
      }
      print ">\n";
   }
}
print "</data>\n";

close FICH;


puis en ligne de commande :
Code: Tout sélectionner
c:\temp\traite.pl fichier.csv


le fichier csv a cette forme :
Code: Tout sélectionner
Titrecolonne1:Titrecolonne2:Titrecolonne3:Titrecolonne4
Valeur1:Valeur2:Valeur3:Valeur4
Valeur5:Valeur6:Valeur7:Valeur8
Valeur9:Valeur10:Valeur11:Valeur12


Voila, bon courage
Damien
damien

Messages : 208

Mer 13 Juin, 2007 12:41

Merci beaucoup Sador et damien.
J'ai utilisé la solution de Sador et ça fonctionne au poil !
Du coup je n'ai pas testé ta solution, damien mais merci quand-même !

Et pour pousser un peu plus loin, [mode lèche-bottes]puisque vous êtes si forts et si efficaces :wink: [/mode], est-ce que c'est possible d'intégrer cette manip à OOo sous forme de macro ? (et puis faire le café aussi :) )
J'ai cru comprendre qu'OOo pouvait utiliser les scripts python...
damj

Messages : 626

Mer 13 Juin, 2007 15:26

damj a écrit:Et pour pousser un peu plus loin, [mode lèche-bottes]puisque vous êtes si forts et si efficaces :wink: [/mode], est-ce que c'est possible d'intégrer cette manip à OOo sous forme de macro ? (et puis faire le café aussi :) )
J'ai cru comprendre qu'OOo pouvait utiliser les scripts python...


Pourquoi dépenser du temps personnel et CPU à lancer OOo alors que ces scripts ridiculement courts font exactement le boulot voulu, en un temps record ? Mieux vaut t'inspirer de ces scripts pour t'en faire bien à toi (en Python, Perl ou n'importe quel autre langage), si tu veux traiter des données tu gagneras un temps fou, et tu auras bien moins de migraines. Surtout pour faire des manips sur des formats hyper standard comme le CSV ou le XML !

Pour des traitements systématiques, surtout de fichiers texte, un bon petit script est souvent infiniment plus adapté (et rigoureux) qu'un gros bouzin WYSIWYG... Si tu es sous Linux, pense à regarder du côté de AWK et du Bash, tu verras que tu pourras faire des traitements de fichiers bien plus puissant que n'importe quel "gros" logiciel. Et si tu es sous Windows, ça te donnera sans doute envie de passer sous Linux :wink:
irimi

Messages : 503

Mer 13 Juin, 2007 16:23

irimi a écrit:
damj a écrit:Et pour pousser un peu plus loin, [mode lèche-bottes]puisque vous êtes si forts et si efficaces :wink: [/mode], est-ce que c'est possible d'intégrer cette manip à OOo sous forme de macro ? (et puis faire le café aussi :) )
J'ai cru comprendre qu'OOo pouvait utiliser les scripts python...


Pourquoi dépenser du temps personnel et CPU à lancer OOo alors que ces scripts ridiculement courts font exactement le boulot voulu, en un temps record ? Mieux vaut t'inspirer de ces scripts pour t'en faire bien à toi (en Python, Perl ou n'importe quel autre langage), si tu veux traiter des données tu gagneras un temps fou, et tu auras bien moins de migraines. Surtout pour faire des manips sur des formats hyper standard comme le CSV ou le XML !

Pour des traitements systématiques, surtout de fichiers texte, un bon petit script est souvent infiniment plus adapté (et rigoureux) qu'un gros bouzin WYSIWYG... Si tu es sous Linux, pense à regarder du côté de AWK et du Bash, tu verras que tu pourras faire des traitements de fichiers bien plus puissant que n'importe quel "gros" logiciel. Et si tu es sous Windows, ça te donnera sans doute envie de passer sous Linux :wink:

Oui, mais dans mon cas il s'agit d'un fichier .ods que je manipule régulièrement (mises à jour, modifications...) et dont je veux sortir cette version xml à chaque fois, donc une intégration à OOo pourrait être intéressante, non ?
Ceci dit avec les scripts donnés ci-dessus j'ai déjà une solution beaucoup plus confortable que ce que je faisais jusque là...
damj

Messages : 626

Mer 13 Juin, 2007 16:38

Re...

alors justement, que ce soit avec perl ou python, il existe des modules qui permettent de manipuler directement les fichiers openoffice ( qui ne sont après tout, que des fichiers XML compressés !! ).

Voila, cordialement
Damien
damien

Messages : 208

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit