Bonjour à tous
Je travaille en python 3.3 et j'ai grand besoin d'un coup de main !
Je récupère dans un traitement un bout de XML et je dois en extraire des données.
Exemple de XML :
Résultat attendu : une chaine de caractères "DSC,Gestions,Juridique,Ingénierie Produit"<?xml version=1.0" ?><t><h t="Link/Namespace Attribute Content" u=""><d n="id" t="long"/><d n="scopeId" t="long"/><d n="type" t="String"/><d n="name" t="String"/><d n="no" t="long"/><d n="qual" t="String"/><d n="language" t="String"/></h><r><c>9117</c><c>0</c><c>NAM/SERVICE</c><c>DSC</c><c>1</c></r><r><c>9122</c><c>0</c><c>NAM/SERVICE</c><c>Gestions</c><c>1</c></r><r><c>9550</c><c>0</c><c>NAM/SERVICE</c><c>Juridique</c><c>1</c></r><r><c>16443</c><c>0</c><c>NAM/SERVICE</c><c>Ingénierie Produit</c><c>1</c></r></t>"
J'ai donc commencé par essayer de parser mon XML ainsi
Ca ne fonctionne pas parce que mon XML est "not well-formed"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 def parseXML(file): xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() xml_file_handle.close() xml_cleaned = re.sub(u'[^\n\r\t\x20-\x7f]+',u'',xml_as_string) root = ET.fromstring(xml_cleaned)
Il y a des quotes à des endroits bizarres.
Je change de stratégie et j'essaye des regexeps.
J'arrive à quelque chose ainsi
Manque de bol, ça ne récupère qu'une des occurences et non pas toutes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 def findInXML(file): xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() m = re.search(r'(.*)<c>NAM(.*)</c><c>(.*)</c><c>(.*)</c>',xml_as_string) if m: print(m.group(3)) else: print('No Match !')
Après un tour dans la doc, je tente avec findall()
Là ça ne marche pas du tout, la regexp me ressort tout le fichier...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 def findInXML2(file): xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() p = re.compile(r'<c>NAM/SERVICE</c><c>(.*)</c><c>[0-9]</c><c>') result = p.findall(xml_as_string) print(result[0])
Est-ce que vous sauriez comment
- Faire le parsing d'un XML "not well-formed"
- Utiliser findall() pour enfin arriver à mes fins ?
- Une autre méthode plus adaptée ?
En pièce jointe le XML d'exemple.
Je vous remercie !
le code complet
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 #!/usr/bin/env python3 # -*- coding: iso-8859-15 -*- # tested with python 3.3 import xml.etree.ElementTree as ET import re def main(): file = 'exemple 2.xml' findInXML2(file) def findInXML2(file): xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() p = re.compile(r'<c>NAM/SERVICE</c><c>(.*)</c><c>[0-9]</c><c>') result = p.findall(xml_as_string) print(result[0]) def findInXML(file): # ... #<c>0</c> #<c>NAM/SERVICE</c> #<c>DSC</c> #<c>1</c> # ... #<c>0</c> #<c>NAM/SERVICE</c> #<c>Gestions</c> #<c>1</c> #... #find = 'NAM/SERVICE' #return 'DSC,Gestions,Juridique' xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() m = re.search(r'(.*)<c>NAM(.*)</c><c>(.*)</c><c>(.*)</c>',xml_as_string) if m: print(m.group(3)) else: print('No Match !') def parseXML(file): #ne fonctionne "XML declaration not well-formed" xml_file_handle = open(file,'r') xml_as_string = xml_file_handle.read() xml_file_handle.close() xml_cleaned = re.sub(u'[^\n\r\t\x20-\x7f]+',u'',xml_as_string) root = ET.fromstring(xml_cleaned) if __name__ == "__main__": main()
Partager