Bonjour,

J'ai quelques soucis concernant le traitement de fichiers 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
<?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 : 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")
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