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 :

apprendre à parser xml


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Octobre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Octobre 2006
    Messages : 58
    Points : 38
    Points
    38
    Par défaut apprendre à parser xml
    Bonjour, je cherche a parser le fichier xml suivant.... mais j'ai du mal !

    pour l'instant j'ai juste écris le code suivant mais je n'accède pas a tout les éléments ! notament <oa:URI>

    bref si quelqu'un peu me donner une piste a creuser pour comprendre comment faire cela ....

    merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php 
    $fichier = 'POLEEMPLOI-Profil_Test_Physicien_v0.1.xml';
    $xml = simplexml_load_file($fichier);
     
    echo '<pre>';
    print_r($xml);
    echo '</pre>';
    Code xml : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    <?xml version="1.0" encoding="utf-8"?>
    <Candidate xmlns:ccts="urn:un:unece:uncefact:documentation:1.1"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:oa="http://www.openapplications.org/oagis/9"
               xmlns:poleemploi="poleemploi"
               xmlns="http://www.hr-xml.org/3"
               xsi:schemaLocation="http://www.hr-xml.org/3../Developer/Nouns/Candidate.xsd"
               languageCode="fr-FR">
        <DataCapture>
            <DataCaptureMethodCode>Automated</DataCaptureMethodCode>
            <FormattedDateTime>2014-04-23</FormattedDateTime>
            <UserArea>
                <poleemploi:CreatedBy>Pôle emploi</poleemploi:CreatedBy>
            </UserArea>
        </DataCapture>
        <CandidatePerson>
            <PersonName>
                <oa:GivenName>Lucile</oa:GivenName>
                <FamilyName>Dupond</FamilyName>
            </PersonName>
            <Communication>
                <ChannelCode>Email</ChannelCode>
                <UseCode>Personal</UseCode>
                <oa:URI>lucile.dupond@yopmail.com</oa:URI>
            </Communication>
            <ResidencyCountryCode>FR</ResidencyCountryCode>
            <BirthDate>1987-02-16</BirthDate>
            <GenderCode>Female</GenderCode>
        </CandidatePerson>
        <CandidateProfile>
            <PersonAvailability>
                <ImmediateStartIndicator>false</ImmediateStartIndicator>
            </PersonAvailability>
            <CandidateObjective>Le titre de mon CV Pole emploi</CandidateObjective>
            <ExecutiveSummary>L'accroche de mon CV Pole emploi</ExecutiveSummary>
            <CandidatePositionPreferences>
                <PreferredLocation>
                    <ReferenceLocation>
                        <oa:CountrySubDivisionCode>FR-85</oa:CountrySubDivisionCode>
                        <oa:CountrySubDivisionCode>FR-S</oa:CountrySubDivisionCode>
                        <CountryCode>IT</CountryCode>
                    </ReferenceLocation>
                    <UserArea>
                        <poleemploi:Commune>
                            <CodeINSEE>33063</CodeINSEE>
                            <Rayon>20</Rayon>
                        </poleemploi:Commune>
                    </UserArea>
                </PreferredLocation>
                <PositionTitle>Physicien quanticien</PositionTitle>
                <PositionScheduleTypeCode>FullTime</PositionScheduleTypeCode>
                <UserArea>
                    <poleemploi:Rome>
                        <CodeRome>K2402</CodeRome>
                        <LibelleRome>Recherche en sciences de l'univers</LibelleRome>
                        <CodeAppellation>17733</CodeAppellation>
                        <LibelleAppellation>Physicien quanticien</LibelleAppellation>
                        <Competences>
                            <Competence>
                                <Code>22721</Code>
                                <Libelle>Analyse statistique</Libelle>
                            </Competence>
                            <Competence>
                                <Code>22096</Code>
                                <Libelle>Mathématiques</Libelle>
                            </Competence>
                            <Competence>
                                <Code>21746</Code>
                                <Libelle>conduite de projet</Libelle>
                            </Competence>
                        </Competences>
                        <EnvironnementsTravail>
                            <EnvironnementTravail>
                                <Code>23735</Code>
                                <Libelle>Bureau d'études et d'ingénierie</Libelle>
                            </EnvironnementTravail>
                            <EnvironnementTravail>
                                <Code>23808</Code>
                                <Libelle>Collectivité territoriale</Libelle>
                            </EnvironnementTravail>
                        </EnvironnementsTravail>
                    </poleemploi:Rome>
                    <poleemploi:Experience>24</poleemploi:Experience>
                    <poleemploi:TypesContrat>
                        <TypeContrat>
                            <Code>CDD</Code>
                            <Libelle>Contrat à durée déterminée</Libelle>
                        </TypeContrat>
                        <TypeContrat>
                            <Code>MIS</Code>
                            <Libelle>Travail intérimaire</Libelle>
                        </TypeContrat>
                    </poleemploi:TypesContrat>
                    <poleemploi:DureeContratSouhaitee>
                        <DureeExacteSouhaitee>300</DureeExacteSouhaitee>
                        <TypeDureeContratSouhaitee>Durée Exacte</TypeDureeContratSouhaitee>
                    </poleemploi:DureeContratSouhaitee>
                </UserArea>
            </CandidatePositionPreferences>
            <EmploymentHistory>
                <EmployerHistory>
                    <OrganizationName>Laboratoire Quantique</OrganizationName>
                    <EmploymentPeriod>
                        <StartDate>
                            <DateText>2014-12</DateText>
                        </StartDate>
                        <CurrentIndicator>true</CurrentIndicator>
                    </EmploymentPeriod>
                    <PositionHistory>
                        <PositionTitle>Chercheur en physique quantique</PositionTitle>
                        <oa:Description>Recherche sur les trous noirs</oa:Description>
                    </PositionHistory>
                </EmployerHistory>
                <EmployerHistory>
                    <OrganizationName>Centre de recherche quantique</OrganizationName>
                    <EmploymentPeriod>
                        <StartDate>
                            <DateText>2013-03</DateText>
                        </StartDate>
                        <EndDate>
                            <DateText>2014-11</DateText>
                        </EndDate>
                    </EmploymentPeriod>
                    <PositionHistory>
                        <PositionTitle>Laborantin</PositionTitle>
                        <oa:Description>Protocoles de laboratoire</oa:Description>
                    </PositionHistory>
                </EmployerHistory>
            </EmploymentHistory>
            <EducationHistory>
                <EducationOrganizationAttendance>
                    <ISCEDEducationLevelCode>5</ISCEDEducationLevelCode>
                    <EducationDegree>
                        <DegreeName>Baccalauréat S</DegreeName>
                        <DegreeDate>
                            <DateText>2005</DateText>
                        </DegreeDate>
                        <ExamPassedIndicator>true</ExamPassedIndicator>
                        <Comment>Spécialité physique-chimie</Comment>
                    </EducationDegree>
                    <UserArea>
                        <poleemploi:OrigineFormation>AFPA</poleemploi:OrigineFormation>
                        <poleemploi:DomaineFormation>15480</poleemploi:DomaineFormation>
                    </UserArea>
                </EducationOrganizationAttendance>
                <EducationOrganizationAttendance>
                    <ISCEDEducationLevelCode>3</ISCEDEducationLevelCode>
                    <EducationDegree>
                        <DegreeName>Doctorat en physique</DegreeName>
                        <DegreeDate>
                            <DateText>2013</DateText>
                        </DegreeDate>
                        <ExamPassedIndicator>false</ExamPassedIndicator>
                        <Comment>Physique quantique</Comment>
                    </EducationDegree>
                    <UserArea>
                        <poleemploi:OrigineFormation/>
                        <poleemploi:DomaineFormation>11450</poleemploi:DomaineFormation>
                    </UserArea>
                </EducationOrganizationAttendance>
            </EducationHistory>
            <Licenses>
                <License>
                    <LicenseID>B</LicenseID>
                    <LicenseTypeCode>MotorVehiclePersonal</LicenseTypeCode>
                    <LicenseName>B</LicenseName>
                    <oa:Description>European driving licence - vehicle categories</oa:Description>
                </License>
                <License>
                    <LicenseID>CE</LicenseID>
                    <LicenseTypeCode>MotorVehiclePersonal</LicenseTypeCode>
                    <LicenseName>CE</LicenseName>
                    <oa:Description>European driving licence - vehicle categories</oa:Description>
                </License>
            </Licenses>
            <PersonQualifications>
                <QualificationsSummary>Mes compétences complémentaires</QualificationsSummary>
                <PersonCompetency>
                    <CompetencyName>Compétence</CompetencyName>
                    <ProficiencyLevel>
                        <ScoreText>Avancé</ScoreText>
                    </ProficiencyLevel>
                </PersonCompetency>
            </PersonQualifications>
            <UserArea>
                <poleemploi:CentresInteret>
                    <CentreInteret>VTT</CentreInteret>
                    <CentreInteret>Tennis</CentreInteret>
                    <CentreInteret>Badminton</CentreInteret>
                    <CentreInteret>Golf</CentreInteret>
                    <CentreInteret>Basket</CentreInteret>
                </poleemploi:CentresInteret>
                <poleemploi:Langues>
                    <Langue>
                        <Code>EN</Code>
                        <InformationsComplementaires>score de 850 au TOEIC</InformationsComplementaires>
                        <Niveau>courant</Niveau>
                    </Langue>
                    <Langue>
                        <Code>DE</Code>
                        <Niveau>Correct</Niveau>
                    </Langue>
                </poleemploi:Langues>
            </UserArea>
        </CandidateProfile>
    </Candidate>

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 881
    Points : 6 607
    Points
    6 607
    Par défaut
    Si on fait:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sxe = simple_xml_load_file('POLEEMPLOI-Profil_Test_Physicien_v0.1.xml');
    var_dump($sxe->CandidatePerson->Communication);
    On obtient:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    object(SimpleXMLElement)#4 (2) {
        ["ChannelCode"]=> string(5) "Email"
        ["UseCode"]=> string(8) "Personal"
    }

    À noter qu'il n'y a aucune mention de URI ou de oa:URI qui est pourtant bien là dans le fichier xml. Pourquoi?

    Parce qu'un objet simpleXMLElement ne peut accéder directement qu'aux éléments de l'espace de nom courant, aux éléments du même espace de nom que lui, pas aux autres, et donc on ne peux pas accéder à oa:URI avec les jolies petites flêflêches toutes mignonnes quand on vient d'un autre espace de nom (dans ce cas précis, l'espace de nom par défaut qui n'a pas de préfixe: http://www.hr-xml.org/3).

    Donc les tentatives désespérées comme: $sxe->CandidatePerson->Communication->URI ou autres, ne marcheront pas.

    Pour surmonter cette difficulté, il faut s'en remettre à l'astuce qui va guider nos pas.

    1ère solution: faire une recherche en paternité.

    On demande au nœud parent si par hasard il n'aurait pas des enfants dans l'espace de nom http://www.openapplications.org/oagis/9 (représenté par le préfixe oa dans le xml) en utilisant la méthode SimpleXMLElement::children:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var_dump($sxe->CandidatePerson->Communication->children('http://www.openapplications.org/oagis/9')->URI);
    // object(SimpleXMLElement)#4 (1) {
    //     [0]=> string(25) "lucile.dupond@yopmail.com"
    // }
    2e solution: on utilise XPath en enregistrant les espaces de noms utiles à son intention.

    Pour pouvoir utiliser des préfixes représentant des espaces de nom dans une requête XPath, il faut au préalable les "enregistrer" avec la méthode SimpleXMLElement::registerXPathNamespace.
    Il faut également enregistrer l'espace de nom par défaut si on veut utiliser des éléments de celui-ci dans la requête puisqu'il est explicitement défini dans le xml. À noter que les préfixes choisis n'ont aucune importance, seules les URLs comptent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sxe->registerXPathNamespace('ns', 'http://www.hr-xml.org/3');
    $sxe->registerXPathNamespace('oa', 'http://www.openapplications.org/oagis/9');
    var_dump($sxe->xpath('/ns:Candidate/ns:CandidatePerson/ns:Communication/oa:URI'));
    // array(1) {
    //     [0]=> object(SimpleXMLElement)#2 (1) {
    //         [0]=> string(25) "lucile.dupond@yopmail.com"
    //     }
    // }
    3e solution: on utilise toujours XPath, mais cette fois-ci on ignore purement et simplement les espaces de nom.

    Si la vocation première des espaces de nom est d'éviter les ambiguïtés entre deux éléments de même nom mais utilisés dans des contextes ou avec des sens différents, il s'avère aussi bien souvent que ceux-ci se retrouvent de fait à n'assurer plus qu'une fonction sémantique. Autrement dit, si le document xml ne comporte pas plusieurs éléments avec le même nom dans des contextes ou avec des sens différents, on peut très bien les ignorer. Quand bien même il y en aurait, si le chemin jusqu'à un élément permet de lever l'ambiguïté, on peut se passer de leur secours.

    Cette dernière solution est donc à adopter avec la précaution qui convient.

    Pour ce faire on utilise * qui représente n'importe quel élément auquel on adjoint un prédicat pour vérifier le nom local de l'élément (donc sans son préfixe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var_dump($sxe->xpath('//*[local-name()="CandidatePerson"]/*[local-name()="Communication"]/*[local-name()="URI"]'));
    // array(1) {
    //     [0]=> object(SimpleXMLElement)#2 (1) {
    //         [0]=> string(25) "lucile.dupond@yopmail.com"
    //     }
    // }

    Ceci dit, on peut au besoin vérifier un espace de nom dans un prédicat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *[local-name()="URI" and namespace-uri()="http://www.openapplications.org/oagis/9"]
    (Dans cette perspective, la solution 2 n'est qu'un moyen d'écrire des requêtes XPath plus courtes.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Octobre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Octobre 2006
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    bonjour !


    un énorme merci !!

    vous m'avez débloqué je vais pouvoir continuer a avancer.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Autodidacte
    Inscrit en
    Octobre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Autodidacte

    Informations forums :
    Inscription : Octobre 2006
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    bonjour,

    j'ai encore un soucis

    j'essaye d'acceder a

    de la maniére suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $langues = $sxe->CandidateProfile->UserArea->children('poleemploi')->Langues;
    var_dump($langues);
    car dans l'entete j'ai lu

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xmlns:oa="http://www.openapplications.org/oagis/9" xmlns:poleemploi="poleemploi"
               xmlns="http://www.hr-xml.org/3" xsi:schemaLocation="http://www.hr-xml.org/3 ../Developer/Nouns/Candidate.xsd

    mais cela ne fonctionne pas... ou est ce que j'ai fait erreur ?

    merci

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 881
    Points : 6 607
    Points
    6 607
    Par défaut
    Toujours pour la raison invoquée précédemment, les éléments enfants de poleemploi:Langues n'ont pas le préfixe poleemploi comme leur parent. Donc pour y accéder il faut de nouveau passer par la méthode SimpleXMLElement::children:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($sxe->CandidateProfile->UserArea->children('poleemploi')->Langues->children());
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [XML] Parser XML
    Par RobinJulie dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/02/2005, 08h48
  2. Parser XML -> PDF
    Par ebaynaud dans le forum Modules
    Réponses: 2
    Dernier message: 12/10/2004, 14h07
  3. [SAX] NoSuchElementException sur parser XML
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/05/2004, 14h42
  4. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  5. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17

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