Bonjour,
J'ai quelques soucis concernant le traitement de fichiers xml.
L'objectif est de récupérer les valeur des sig_id, buffer, offset, length en fonction du <viol_name> et du <context>.
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 <?xml version='1.0' encoding='UTF-8'?> <BAD_MSG> <request-violations> <violation> <viol_index>42</viol_index> <viol_name>VIOL_ATTACK_SIGNATURE</viol_name> <context>parameter</context> <parameter_data> <value_error/> <enforcement_level>global</enforcement_level> <name>bmFtZTE=</name> <value>dmFsdWV2aW9sYXRpb24J</value> <param_name_pattern>*</param_name_pattern> <staging>0</staging> </parameter_data> <staging>0</staging> <sig_data> <sig_id>200000073</sig_id> <blocking_mask>7</blocking_mask> <kw_data> <buffer>Qm9uam91cjEJ</buffer> <offset>38</offset> <length>63</length> </kw_data> </sig_data> <sig_data> <sig_id>200002611</sig_id> <blocking_mask>7</blocking_mask> <kw_data> <buffer>Qm9uam91cjI=</buffer> <offset>38</offset> <length>26</length> </kw_data> </sig_data> </violation> <violation> <viol_index>42</viol_index> <viol_name>VIOL_ATTACK_SIGNATURE</viol_name> <context>request</context> <sig_data> <sig_id>200011069</sig_id> <blocking_mask>7</blocking_mask> <kw_data> <buffer>Qm9uam91cjM=</buffer> <offset>62</offset> <length>1</length> </kw_data> <kw_data> <buffer>Qm9uam91cjQ=</buffer> <offset>44</offset> <length>16</length> </kw_data> </sig_data> </violation> <violation> <viol_index>14</viol_index> <viol_name>VIOL_HTTP_PROTOCOL</viol_name> <http_sanity_checks_status>1</http_sanity_checks_status> <http_sub_violation_status>1</http_sub_violation_status> </violation> </request-violations> </BAD_MSG>
Par exemple: quand <viol_name> = VIOL_ATTACK_SIGNATURE et que <context> = parameter je dois récupérer les sig_id (200000073, 200002611) ainsi que les buffer/offset/length qui leurs sont rattachés.
Mais dès que le contexte passe en request il faut que je récupère le sig_id 200011069 et les buffer/offset/length qui suivent.
Même chose quand le <viol_name> change.
Le problème que j'ai, est que les infos ne sont pas regroupées par blocs distincts et sont au même niveau dans l'arborescence.
Le souci de mon code c'est qu'il va me sortir pour le contexte parameter tous les Sig_id/Buffer/Offset/Length du fichier et va faire la même chose pour le contexte request.
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 for nme in root.iter("viol_name"): name = nme.text print(name) if name == "VIOL_ATTACK_SIGNATURE": for ctx in root.iter("context"): context = ctx.text if context == "parameter": print("Context: " + context) for enfor in root.iter("enforcement_level"): print(enfor.text) for name in root.iter("name"): namedecode = base64.b64decode(name.text).decode() print(namedecode) for val in root.iter("value"): value = base64.b64decode(val.text).decode() print("Value: " + value) for data in root.iter("sig_data"): print("Sig_id: " + data.findtext("sig_id")) print("Blocking_mask: " + data.findtext("blocking_mask")) buff = data.findtext("kw_data/buffer") buffer = base64.b64decode(buff).decode() print("Buffer: " + buffer) print("Offset: " + data.findtext("kw_data/offset")) print("Length: " + data.findtext("kw_data/length") + "\r\n")
J'ai essayé de modifié le code en mettant un while à la place de if name == "VIOL_ATTACK_SIGNATURE" et if context == "parameter" mais ça me fait une boucle infinie même quand je mets un break.
Merci pour votre aide
Partager