Analyse fichier XML - Boucle
Bonjour,
J'ai quelques soucis concernant le traitement de fichiers xml.
Code:
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> |
L'objectif est de récupérer les valeur des sig_id, buffer, offset, length en fonction du <viol_name> et du <context>.
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.
Code:
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") |
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.
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