Bonjour,

Je développe un module Apache sensé parser du XML recupéré dans les données POST de la requête http. Une fois parsé, je dois recupérer les valeurs de 3 champs.

La tête du XML est la suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
<?xml version="1.0" encoding="UTF-8"?><endbRequest xmlns="UdbEndbInterface" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="EndbInterface C:\endbRequest.xsd">
     <Id>00000000000000000000</Id>
     <Code>23</Code>
     <Country-Code>33</Country-Code>
     <Area-Code>12345</Area-Code>
     <Location-Info>0000000000</Location-Info>
     <Vip>299876543</Vip>
     <Survip>12</Survip>
</endbRequest>
Les champs ont les spécifications suivantes :
  • Id : 20 alphanumériques
  • Code : 2 numériques
  • Country-Code : 2 numériques
  • Area-Code : 0 ou 5 numériques
  • Location-Info : 0 ou 10 numériques
  • Vip : 9 ou 10 numériques
  • Survip : entre 2 et 6 numériques


Les champs à recupérer sont les champs AreaCode, Vip et Survip. Le champ Location-Info peut lui avoir une longueur de 0 ou 10 numériques

Voici l'expression regulière que j'ai défini :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
#define EXP_REGU "<\?xml version=\"1\.0\" encoding=\"UTF-8\"\?.>
<endbRequest xmlns=\"UdbEndbInterface\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"EndbInterface C:[\\]{1,2}endbRequest\.xsd\">
   <Id>[[:alnum:]]{20}</Id>
   <Code>[0-9]{2}</Code>
   <Country-Code>[0-9]{2}</Country-Code>
   <Area-Code>([0-9]{0}|[0-9]{5})</Area-Code>
   <Location-Info>\(|[[:digit:]]{10}\)</Location-Info>
   <Calling>([0-9]{9}|[0-9]{10})</Calling>
   <Called>([0-9]{2,6})</Called>
</endbRequest>"
Je l'utilise à l'aide des instructions suivantes, où buffer contient la chaine de charactères à traiter et regNumber est de type regex_t:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
iRc=regcomp(&(newcfg->regNumber), EXP_REGU, REG_EXTENDED | REG_NEWLINE);
...
iRc=regexec(&(s_cfg->regNumber), buffer, NBR_TOKEN, pMacht, 0);
Mon expression regulière s'execute bien mais en un temps catastrophique (a peu près 100 fois plus lent que si le champs n'avait eu qu'une longueur de possible)

Je pense être passé à coté de quelque chose et j'ai beau fouillé le man et google et je ne trouve pas d'indice.

Si des gens ont une idée car moi j'y vois plus très clair...

Merci d'avance