IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

traitement balise XML avec caractères ":" dans le nom [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut traitement balise XML avec caractères ":" dans le nom
    Bonjour !

    Avec mon petit niveau de développeur amateur, j'ai créé pour le boulot une série de scriptes pour récupérer les données de fichiers XML fourni par une agence de presse, les importer dans une base MySQL et les rendre disponibles à la consultation depuis l'intranet de la société via un serveur web Apache, le tout sous Debian.

    Or tout fonctionnait à merveille, jusqu'à ce que cette agence n'annonce quelques modifications à vennir dans le format des ces fichiers, et notamment l'apparition de nouvelles données, et donc nouvelles balises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <rtr:role qcode="partRole:slate"/>
    et c'est là que je bloque, ces balises rtr:qcode apparaissent plusieurs fois avec des qcode différents et à cause de la présence des ":" dans le nom, je n'arrive pas à y faire référence.
    Si j'invoque tel quel le nom de la balise, le scripte bloque systématiquement, si j'omets les deux points, la balise n'est pas détectée (logique) et j'ai essayé tout ce que je pouvais pour encadrer ou échapper ce caractère, mais rien n'y fait, je bloque ...

    Quelqu'un pourrait il m'éclairer sur la façon de faire ou me donner une piste de recherche ?

    D'avance Merci,

    JKlr

  2. #2
    Membre habitué Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Points : 155
    Points
    155
    Par défaut
    je suis pas très au courant du xml mais php je me débrouille un peut.

    Tu a fait ton propre parseur de xml ou tu utilise quelque chose de déjà fait ?

    sinon tu a essayé de faire manger le fichier en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlcontant = str_replace(":", "", fileContent);
    et en mettant les noms de balise sans ":"

    sinon je suis pas un pro mais je pense que ça peut marcher.

    ++
    Le langage de programmation le plus vieux, le plus optimiser et le plus efficace est l'ADN quelqu'un d'extrêmement intelligent l'a obligatoirement inventé.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonsoir et merci pour cette réponse.

    Au sujet du parser, je n'en utilise pas, après ouverture du fichier, j'accède directement aux données.

    En ce qui concerne l'idée (qui me semblait très bonne) d'utiliser la fonction str_replace, après pas mal de tests, cela ne semble pas vouloir fonctionner.

  4. #4
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Le caractère ':' sert à séparer ce que l'on appelle le préfixe du nom local de l'élément.

    Le préfixe est le diminutif d'un "espace de noms" (namespace en anglais).

    L'utilisation des espaces de noms permet d'éviter les conflits au niveau des noms locaux d'éléments mais cela complique fortement la programmation, certains environnements n'arrivant, même, pas à bien les gérer !

    Quel est votre environnement précis ? Quelle API utilisez vous ?
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour Alain !

    En fait j'utilise actuellement uniquement les fonctions de php5 de SimpleXML et je crains d'en avoir atteins les limites.
    La solution se trouve peut être dans l'utilisation de DOM ou XSL, mais là c'est pour l'instant hors de ma portée.
    Cependant si quelqu'un connaît un tutoriel en ligne sur XSL, car j'en ai déjà lu quelques un, mais je bloque sur le sujet.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Pour bien illustrer mon problème, voici divers extraits de code :

    la partie du fichier 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
     
    <newsMessage>
    (...)
    <itemSet>
    (...)
    <newsItem>
    (...)
    <partMeta>
       <timeDelim start="00:00:00.000" end="00:00:05.000" timeunit="timeunit:normalPlayTime"/>
       <rtr:role qcode="partRole:slate"/>
    </partMeta>
    <partMeta>
       <timeDelim start="00:00:05.000" end="00:01:27.000" timeunit="timeunit:normalPlayTime"/>
       <rtr:role qcode="partRole:content"/>
    </partMeta>
    <partMeta>
       <timeDelim start="00:00:09.000" end="00:00:10.000" timeunit="timeunit:normalPlayTime"/>
       <rtr:role qcode="partRole:keyframe"/>
    </partMeta>
    (...)
    <newsItem>
    (...)
    <itemSet>
    (...)
    <newsMessage>
    et si j'utilise ce petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
     if (file_exists('test.xml'))
     {
     $xml = simplexml_load_file('test.xml');
     }
     
     foreach ($xml->itemSet->newsItem[1]->partMeta as $partMeta) {
     print_r($partMeta);
             }
    ?>
    Voici ce que j'obtiens en sortie :

    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
    SimpleXMLElement Object
    (
        [timeDelim] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [start] => 00:00:00.000
                        [end] => 00:00:05.000
                        [timeunit] => timeunit:normalPlayTime
                    )
            )
    )
    SimpleXMLElement Object
    (
        [timeDelim] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [start] => 00:00:05.000
                        [end] => 00:01:27.000
                        [timeunit] => timeunit:normalPlayTime
                    )
            )
    )
    SimpleXMLElement Object
    (
        [timeDelim] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [start] => 00:00:09.000
                        [end] => 00:00:10.000
                        [timeunit] => timeunit:normalPlayTime
                    )
            )
    )
    et mon problème est que j'ai besoin de vérifier le statu qcode de la balise rtr:role.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bon loin de moi l'idée de confondre le forum avec mon journal intime de développeur néophyte, mais voici la solution que j'ai finalement trouvée.
    C'est peut être pas l'élégance même côté code, mais cela fonctionne et peut servir à d'autre.

    Toujours à l'aide du fichier .xml cité dans le message précédent, et le code suivant:

    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
     
    <?php
     if (file_exists('test.xml'))
     
     {
     $xml = simplexml_load_file('test.xml');
     }
     
     foreach ($xml->itemSet->newsItem[1]->partMeta as $partMeta) {
     
             $TCin = $partMeta->timeDelim['start'];
             $TCout = $partMeta->timeDelim['end'];
     
             $partMeta = $partMeta->asXML();
             $partMeta = str_replace(":", "", $partMeta);
             if (preg_match("/partRoleslate/", $partMeta)) {
                     echo "TC in  pour Slate " . $TCin ."\n";
                     echo "TC out pour Slate " . $TCout ."\n";
                     }
             if (preg_match("/partRolecontent/", $partMeta)) {
                     echo "TC in pour Content " . $TCin ."\n";
                     echo "TC out pour Content " . $TCout ."\n";
                     }
             if (preg_match("/partRolekeyframe/", $partMeta)) {
                     echo "TC de lai KeyFrame " . $TCin ."\n";
                     }
             }
     ?>
    on obtient le résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TC in  pour Slate 00:00:00.000
    TC out pour Slate 00:00:05.000
    TC in pour Content 00:00:05.000
    TC out pour Content 00:01:27.000
    TC de la KeyFrame 00:00:09.000
    ce qui est ce que je cherchais

    Bonne nuit !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/11/2008, 20h10
  2. Python probleme pour traitement fichier Xml avec l'API dom
    Par chenimitz dans le forum Général Python
    Réponses: 11
    Dernier message: 30/10/2007, 19h34
  3. [Xerces] pb de validation xml avec un schema stocké dans un jar
    Par dvicente72 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/07/2007, 11h33
  4. Réponses: 1
    Dernier message: 28/06/2007, 02h24
  5. [DOM] Erreur parser fichier xml avec caractère spéciaux
    Par turcotm dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/06/2006, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo