bonjour à tous,
dans le cadre d'une migration de base de données de winisis(base de données documentaire de l'omvs) vers mysql,j'ai adopté la procédure suivante:

-récupération des bases de données au format xml avec isis2xml
-à partir du format xml générer un csv
-et enfin du fichier csv généré migrer tout le contenu dans la base de données mysql

les contraintes:

-pour la base de données j'ai un certain nombre de champs dont les noms vont devenir les balises xml(par exemple j'ai 6 champs qui vont donner 6 Tags nommés de Tag_1 à Tag_6(ou les noms des champs dans la base peu importe)
-chaque bloc <RECORD> de mon fichier xml(voir fichier joint test.xml) correspond à une ligne avec les différents Tag_x correspondants au champs
*MAIS chaque bloc <RECORD> N'EST PAS OBLIGER D'AVOIR LES 6 champs,il peut avoir Tag_1,Tag_2...pas de Tag_4...Tag_6..ect
*De même un Tag_x peut être répété plusieurs fois dans un bloc <RECORD>

Résultat attendu lors de la création du fichier csv:
-chaque bloc <RECORD> correspond à une ligne et chaque Tag dans une cellule
-si une balise Tag_x n'est pas dans un bloc <RECORD> laisser la cellule dans le fichier csv vide ou mettre valeur null
- si un Tag est répété plusieurs fois dans un bloc <RECORD> exemple:
<RECORD>
....
...
<Tag_5>x</Tag_5>
<Tag_5>y</Tag_5>
<Tag_5>z</Tag_5>
</RECORD>
il faut les concater en les séparant par le symbole '||' ce qui doit donner x||y||z

exemple de sortie csv: test.xml=>test.csv
-Les entêtes du fichier csv:
Tag_1 =Auteur
Tag_2 = Titre
Tag_3 = Lieu
Tag_4 = Date
Tag_5 = Editeur(s)
Tag_6 = Mots clés
-séparateur: $
-ouverture du fichier dans un éditeur de texte:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
"Auteur$Titre$Lieu$Date$Editeur(s)$Mots clés"
"zzeze$grthhh$fdzee$efrerg$phhh$perezf||ergrg||efgrgg"
"pzderrt$fjpoerer$null$ggghghghg$fhgf||fhfuhrr$fhhejr"
"zeaeeyr$pprirtu$fgjjrt$null$dhjehe||fdggg||fdzf||fffrf$null"
"dfffggg$fghthyj$fggtrhhy$ffrregggg$null$dhhfjgj||dffff||ffffgfg"
-Aprés ouverture du fichiercsv dans un tableur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Auteur          Titre          Lieu              Date                      Editeur(s)                                                 Mots clés
zzeze            grthhh        fdzee           efrerg                     phhh                                                         perezf||ergrg||efgrgg
pzderrt          fjpoerer      null             ggghghghg               fhgf||fhfuhrr                                              fhhejr
zeaeeyr         pprirtu        fgjjrt           null                        dhjehe||fdggg||fdzf||fffrf                              null
dfffggg          fghthyj        fggtrhhy       ffrregggg                null                                                           dhhfjgj||dffff||ffffgfg
Aide demandée:
je n'ai pas de souci pour générer le fichier xml,de même que le fichier csv avec un petit programme python,Mais mon souci principal est le fait que comme on a pas tout le temps le même nombre de balise Tag_x dans chaque bloc <RECORD> du fichier xml le programme au lieu de laisser les champs dont les Tag n'ont pas étaient trouvés vide ou mettre null,il les remplit avec le contenu de la valeur du premier Tag_x trouvé:exemple si on est dans la ligne 2 si le Tag_4 n'existe pas alors il prend la valeur du Tag_4 de la ligne 1...etc ce qui n'est pas correcte.
De même si le même Tag est rencontré plusieur fois dans un bloc <RECORD> j'arrive à concaténer toutes les valeurs en les séparant par || mais le souci est que pour le dernier de la liste il rajoute également || exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<RECORD>
....
...
<Tag_5>x</Tag_5>
<Tag_5>y</Tag_5>
<Tag_5>z</Tag_5>
</RECORD>
une fois la concaténation effectuée j'ai x||y||z|| donc il faut arriver à détecter le nombre de fois que le Tag_5 a été trouvé ,de rajouter à chaque fois '||' lors de la concaténation SAUF aprés le dernier ===> x||y||z
contenu fichier test.xml:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
<?xml version="1.0" encoding="UTF-8"?>
 
<DATABASE>
	<RECORD>
		<Tag_1>G Bush</Tag_1>
		<Tag_2>good moning vietnam</Tag_2>
		<Tag_3>Vietnam</Tag_3>
		<Tag_4>20/12/2011</Tag_4>
		<Tag_5>eyrolles</Tag_5>
		<Tag_5>la redoute</Tag_5>
		<Tag_5>ENI</Tag_5>
		<Tag_6>vietnam</Tag_6>
		<Tag_6>guerre</Tag_6>
		<Tag_6>amérique</Tag_6>
	</RECORD>
	<RECORD>
		<Tag_1>Aime cesaire</Tag_1>
		<Tag_2>Et les chiens se taisaient</Tag_2>
		<Tag_3>Martinique</Tag_3>
		<Tag_6>Martinique</Tag_6>
		<Tag_6>colonisation</Tag_6>
		<Tag_6>afrique</Tag_6>
		<Tag_6>négre</Tag_6>
		<Tag_6>négritude</Tag_6>
	</RECORD>
	<RECORD>
		<Tag_1>Cheikh Anta diop</Tag_1>
		<Tag_2>nations négres et cultures</Tag_2>
		<Tag_3>paris</Tag_3>
		<Tag_3>Sénégal</Tag_3>
		<Tag_3>Mali</Tag_3>
		<Tag_4>20/01/1963</Tag_4>
		<Tag_5>Presence africaines</Tag_5>
		<Tag_5>la redoute</Tag_5>
		<Tag_5>ENI</Tag_5>
		<Tag_5>Mollat</Tag_5>
		<Tag_5>Green library</Tag_5>
		<Tag_6>negritude</Tag_6>
		<Tag_6>Egypte</Tag_6>
		<Tag_6>champollion</Tag_6>
		<Tag_6>carbone14</Tag_6>
	</RECORD>
	<RECORD>
		<Tag_1>Albert camus</Tag_1>
		<Tag_2>L'étranger</Tag_2>
		<Tag_3>alger / algerie</Tag_3>
		<Tag_5>eyrolles</Tag_5>
		<Tag_6>algérie</Tag_6>
		<Tag_6>france</Tag_6>
		<Tag_6>colonialisme</Tag_6>
		<Tag_6>musulman</Tag_6>
	</RECORD>
	<RECORD>
		<Tag_1>Aime cesaire</Tag_1>
		<Tag_2>La tragédie du roi christophe</Tag_2>
		<Tag_3>Paris</Tag_3>
		<Tag_4>14/12/1969</Tag_4>
		<Tag_5>Présences africaines</Tag_5>
		<Tag_5>Mollat</Tag_5>
		<Tag_6>haitie</Tag_6>
		<Tag_6>france</Tag_6>
		<Tag_6>décolonisation</Tag_6>
		<Tag_6>noir</Tag_6>
		<Tag_6>guerre</Tag_6>
		<Tag_6>liberation</Tag_6>
	</RECORD>
	<RECORD>
		<Tag_1>Aime cesaire</Tag_1>
		<Tag_2>Cahier d'un retour au pays natal</Tag_2>
		<Tag_3>russie</Tag_3>
		<Tag_4>03/11/1957</Tag_4>
		<Tag_5>Eyrolles</Tag_5>
		<Tag_6>nostalgie</Tag_6>
		<Tag_6>négritude</Tag_6>
		<Tag_6>immigration</Tag_6>
		<Tag_6>distance</Tag_6>
	</RECORD>
</DATABASE>
exemple de programme python(ceci était la première version du programme sans le code qui permet de concaténer les contenus des mêmes Tag_x trouvés dans un bloc <RECORD>):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import xml.etree.cElementTree as xmlTree
import sys
import csv
 
if len(sys.argv) <= 1:
    raise Exception("Usage: %s xml-file" % sys.argv[0])
 
filename = sys.argv[1]
fichier = open(filename, 'r')
tree = xmlTree.fromstring(fichier.read())
lang_elements = tree.getiterator("RECORD")
out = csv.writer(open('test.csv','wb'), delimiter='$',quoting=csv.QUOTE_ALL)
out.writerow(['Auteur', 'Titre' , 'Lieu de Publication', 'Date de Publication', 'Editeur', 'mots Clés'])
for lang in lang_elements:
    for characteristic in lang:
        if characteristic.tag == "Tag_1":
            auteur = characteristic.text
        elif characteristic.tag == "Tag_2":
            titre = characteristic.text
        elif characteristic.tag == "Tag_3":
            LieuPublication = characteristic.text
        elif characteristic.tag == "Tag_4":
            DatePublication = characteristic.text
        elif characteristic.tag == "Tag_5":
            Editeur = characteristic.text
        elif characteristic.tag == "Tag_6":
            motsCles = characteristic.text
    #print "%s$%s$%s$%s$%s$%s" % (auteur, titre , LieuPublication, DatePublication, Editeur, motsCles)
    ligne = u"%s$%s$%s$%s$%s$%s" % (auteur, titre , LieuPublication, DatePublication, Editeur, motsCles)
    data = [(ligne.encode('UTF-8'))]    
    out.writerow(data)
Merci de votre aide ou de vos suggestions