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 :
Les champs ont les spécifications suivantes :
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>
- 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 :
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
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>"
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)
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);
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éecar moi j'y vois plus très clair...
Merci d'avance![]()
Partager