Précédent   Forum du club des développeurs et IT Pro > Autres langages > XML/XSL et SOAP > APIs
APIs DOM, SAX, JAXP,STAX... leur fonctionnement, leurs implémentations Avant de poster -> FAQ XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/11/2010, 09h45   #1
damien.s
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut [PHP][XPATH] problème de chemin

Bonjour,

Je cherche à charger la première photo mais j'ai un problème au niveau de mon chemin ; c'est à dire :

L'élément newsCoponent avec attribut Duid="photo0" ;
La donnée de l'atribut Href dans l'élément ContentItem ;
Qui a pour Role FormalName="Thumbnail" ;


le fichier xml :
Code :
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
 
<?xml version="1.0" encoding="UTF-8"?>
<NewsML Version="1.2">
  <Catalog Href="http://www.afp.com/dtd/AFPCatalog.xml"/>
  <NewsEnvelope>
    <DateAndTime>20101108T070638Z</DateAndTime>
  </NewsEnvelope>
  <NewsItem>
    <Identification>
      <NewsIdentifier>
        <ProviderId>afp.com</ProviderId>
        <DateId>20101108</DateId>
        <NewsItemId>CNG.47ab18a676f3a97600ed0c2cd32b4368.01</NewsItemId>
        <RevisionId PreviousRevision="1" Update="N">2</RevisionId>
        <PublicIdentifier>urn:newsml:afp.com:20101108:CNG.47ab18a676f3a97600ed0c2cd32b4368.01:2</PublicIdentifier>
      </NewsIdentifier>
      <NameLabel>Energie-nucléaire-environnement-social-manifestation</NameLabel>
    </Identification>
    <NewsManagement>
      <NewsItemType FormalName="News"/>
      <FirstCreated>20101105T112526Z</FirstCreated>
      <ThisRevisionCreated>20101108T070617Z</ThisRevisionCreated>
      <Status FormalName="Usable"/>
    </NewsManagement>
    <NewsComponent>
      <NewsLines>
        <HeadLine>Convoi de déchets nucléaires: l'évacuation des opposants est finie</HeadLine>
        <DateLine>DANNENBERG (Allemagne) (AFP)</DateLine>
        <CopyrightLine>© 2010 AFP</CopyrightLine>
        <SlugLine>Energie-nucléaire-environnement-social-manifestation</SlugLine>
      </NewsLines>
      <AdministrativeMetadata>
        <Provider>
          <Party FormalName="AFP" />
        </Provider>
      </AdministrativeMetadata>
      <DescriptiveMetadata>
        <Language FormalName="fr" />
        <OfInterestTo FormalName="francais--journal--une"/>
        <Location HowPresent="Origin">
          <Property FormalName="Country" Value="DEU"/>
          <Property FormalName="City" Value="DANNENBERG"/>
          <Property FormalName="Latitude" Value="49.51667"/>
          <Property FormalName="Longitude" Value="-1.46667"/>
        </Location>
        <SubjectCode>
          <Subject FormalName="06000000"/>
        </SubjectCode>
        <SubjectCode>
          <Subject FormalName="06000000"/>
        </SubjectCode>
        <SubjectCode>
          <SubjectDetail FormalName="04005005"/>
        </SubjectCode>
        <SubjectCode>
          <Subject FormalName="09000000"/>
        </SubjectCode>
        <SubjectCode>
          <SubjectMatter FormalName="16008000"/>
        </SubjectCode>
      </DescriptiveMetadata>
      <NewsComponent>
        <ContentItem>
          <MediaType FormalName="Text"/>
          <Format FormalName="bcNITF2.5"/>
          <DataContent>
            <media media-type="image" style="leftSide">
              <media-reference data-location="#photo0" mime-type=""/>
            </media>
            <p>La police allemande a achevé lundi matin l'évacuation des manifestants qui bloquaient la voie ferrée que doit emprunter un convoi de déchets nucléaires venu d'un site d'Areva en France vers le site de stockage de Gorleben (nord), une opération qui a duré toute la nuit.</p>
            <p>"L'évacuation est terminée, il n'y plus personne sur la voie ferrée", a dit à l'AFP vers 07H30 (06H30 GMT) une porte-parole de la police à Lunebourg.</p>
            <p>La police estime qu'au début de l'évacuation, qui s'est passée dans le calme, environ 3.000 personnes étaient présentes pour faire barrage au convoi, à Harlingen, à une quinzaine de kilomètres environ de la gare de Dannenberg.</p>
            <p>C'est là que la cargaison du train, parti de France vendredi, sera transférée sur des camions pour les 20 derniers kilomètres jusqu'à Gorleben.</p>
            <p>Le train a passé la nuit à l'arrêt à Dahlenburg, une dizaine de kilomètres en amont de Harlingen et ne devait redémarrer qu'une fois la voie entièrement libre.</p>
            <p>Certains manifestants ayant tenté de retourner sur les voies après avoir été délogés par les policiers ont été placés en garde-à-vue, a dit la police.</p>
            <p>D'autres qui n'obtempéraient pas ont eux aussi été interpellés, et placés dans des tentes sous surveillance policière dans un champ proche, a précisé la porte-parole.</p>
            <media media-type="image" style="rightSide">
              <media-reference data-location="#photo1" mime-type=""/>
            </media>
            <p>Elle n'était pas en mesure de dire combien de personnes étaient concernées.</p>
            <p>Ces manifestants resteront en garde-à-vue jusqu'à ce que le convoi "Castor", du nom des conteneurs spéciaux abritant les déchets nucléaires soit arrivé en gare de Dannenberg, a-t-elle dit.</p>
            <p>De nombreux manifestants ont accepté de quitter les lieux par leurs propres moyens, d'autres ont opté pour une résistance passive, se laissant porter par les policiers loin des rails.</p>
            <p>Au total, près de 20.000 fonctionnaires de police ont déjà été mobilisés en Allemagne pour protéger ce convoi, selon le chef du syndicat policier DPolG, Rainer Wendt, cité dans les médias allemands.</p>
            <p>Il s'agit du 12e convoi depuis 1995 rapatriant vers l'Allemagne des déchets nucléaires allemands retraités en France. Des violences avaient émaillé la journée de dimanche entre manifestants et policiers.</p>
          </DataContent>
        </ContentItem>
      </NewsComponent>
      <NewsComponent Duid="photo0">
        <NewsLines>
          <HeadLine>Des policiers tentent de déloger des militants antinucléaires qui cherchent à couper la voie ferrée pour empêcher le passage d'un train de déchets radioactifs, le 7 novembre 2010 à Metzingen en Allemagne</HeadLine>
        </NewsLines>
        <AdministrativeMetadata>
          <Provider>
            <Party FormalName="AFP"/>
          </Provider>
          <Creator>
            <Party FormalName="Johannes Eisele"/>
          </Creator>
        </AdministrativeMetadata>
        <NewsComponent>
          <Role FormalName="Caption"/>
          <ContentItem>
            <MediaType FormalName="Text"/>
            <Format FormalName="bcNITF2.5"/>
            <DataContent>
              <p>La police allemande a achevé lundi matin l'évacuation des manifestants qui bloquaient la voie ferrée que doit emprunter un convoi de déchets nucléaires venu d'un site d'Areva en France vers le site de stockage de Gorleben (nord), une opération qui a duré toute la nuit.</p>
            </DataContent>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Thumbnail"/>
          <ContentItem Href="photo_1289143089462-1-2.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="110"/>
              <Property FormalName="Height" Value="66"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Quicklook"/>
          <ContentItem Href="photo_1289143089462-1-1.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="245"/>
              <Property FormalName="Height" Value="148"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Preview"/>
          <ContentItem Href="photo_1289143089462-1-0.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="512"/>
              <Property FormalName="Height" Value="309"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
      </NewsComponent>
      <NewsComponent Duid="photo1">
        <NewsLines>
          <HeadLine>Convoi de déchets radioactifs</HeadLine>
        </NewsLines>
        <AdministrativeMetadata>
          <Provider>
            <Party FormalName="afp.com"/>
          </Provider>
          <Creator>
            <Party FormalName=""/>
          </Creator>
        </AdministrativeMetadata>
        <NewsComponent>
          <Role FormalName="Caption"/>
          <ContentItem>
            <MediaType FormalName="Text"/>
            <Format FormalName="bcNITF2.5"/>
            <DataContent>
              <p>Carte situant les principales actions des antinucléaires sur le trajet d'un convoi ferroviaire de déchets nucléaires allemands retraités de la France vers l'Allemagne</p>
            </DataContent>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Thumbnail"/>
          <ContentItem Href="photo_1289174035651-1-2.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="110"/>
              <Property FormalName="Height" Value="98"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Quicklook"/>
          <ContentItem Href="photo_1289174035651-1-1.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="245"/>
              <Property FormalName="Height" Value="218"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
        <NewsComponent>
          <Role FormalName="Preview"/>
          <ContentItem Href="photo_1289174035651-1-0.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="512"/>
              <Property FormalName="Height" Value="455"/>
            </Characteristics>
          </ContentItem>
        </NewsComponent>
      </NewsComponent>
    </NewsComponent>
  </NewsItem>
</NewsML>
Pour l'instant j'ai effectué ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
//Gestion du contenu des articles  
   $xmlArticle = simplexml_load_file($path.'newsmlmmd.'.$itemRef.'.xml');
 
    //Verrification du chemin
   if (!$xmlArticle) {
        echo "Erreur lors du chargement du XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }
 
   $basePhoto = $xmlArticle->xpath('//NewsComponent[@Duid="photo0"]/NewsComponent[Role/@FormalName="Thumbnail"]/ContentItem[@Href]');
 
   if (!$basePhoto) {
        echo "Erreur lors du chargement du chemin XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
 
    }else{
       echo $basePhoto;
    }

Je remet mon xpath pour mieux cerner le problème :
Code :
1
2
 
$xmlArticle->xpath('//NewsComponent[@Duid="photo0"]/NewsComponent[Role/@FormalName="Thumbnail"]/ContentItem[@Href]');
Et il ne m'affiche rien même pas un erreur Et je bloque est ce que quelqu'un aurais une idée ou je me serais tromper par hasard ?

Je vous remercie par avance.

Edit: Une petite erreur sur le else de la condition (!$basePhoto) et là il m'affiche Array le hic c'est qu'il devrait m'afficher photo_1289174035651-1-2.jpg du moins c'est ce que je désirs
damien.s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2010, 11h02   #2
damien.s
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut [PHP-XPATH] problème de chemin -> réussir à recupérer la valeur d'attribut

Bon au final ce n'est pas mon chemin qui est véritablement faux j'explique :

j'ai effectué un print_r() à ma varriable de chemin (je précise que j'ai enlevé @Href car il me donne tout à l'identique ce qui suit):

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$basePhoto = $xmlArticle->xpath('//NewsComponent[@Duid="photo0"]/NewsComponent[Role/@FormalName="Thumbnail"]/ContentItem');
 
   if (!$basePhoto) {
        echo "Erreur lors du chargement du chemin XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }else{
 
          print_r($basePhoto);
        }
Et je me retrouvavec des tableaux de ce type :

Citation:
Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [Href] => photo_1289375899838-1-2.jpg ) [MediaType] => SimpleXMLElement Object ( [@attributes] => Array ( [FormalName] => Photo ) ) [Characteristics] => SimpleXMLElement Object ( [Property] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [FormalName] => Width [Value] => 110 ) ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [FormalName] => Height [Value] => 73 ) ) ) ) ) )
c'est à dire dans le fichier xml ceci :
Code :
1
2
3
4
5
6
7
8
 
        <ContentItem Href="photo_1289143089462-1-2.jpg">
            <MediaType FormalName="Photo"/>
            <Characteristics>
              <Property FormalName="Width" Value="110"/>
              <Property FormalName="Height" Value="66"/>
            </Characteristics>
          </ContentItem>
Par la suite je remplace mon print_r par ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$basePhoto = $xmlArticle->xpath('//NewsComponent[@Duid="photo0"]/NewsComponent[Role/@FormalName="Thumbnail"]/ContentItem');
 
   if (!$basePhoto) {
        echo "Erreur lors du chargement du chemin XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }else{
          $donneeResult =  $basePhoto[0]['Href']->asXml();
        }
    echo $donneeResult;
et je me retrouve avec :
Citation:
Href="photo_1289143089462-1-2.jpg"
le hic maintenant c'est que je recherche la valeur de l'attribut c'est à dire : photo_1289143089462-1-2.jpg

et je n'arrive pas à trouver le moyen de faire ceci juste après l'avoir récupéré dans un array , voir même si c'est possible de récuperer directement dans mon xpath cette donnée vu que le reste ne m'intéresse pas à ce niveau.

Si vous avez des suggestion je suis à votre écoute.

Je vous remercie par avance
damien.s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/11/2010, 11h58   #3
damien.s
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Resolution

Au final c'est tout "simple" (j'aimerais bien dire autre chose )

Il suffit d'enlever le ->asXml() ou d'utiliser un str_replace()
"asXml() : // asXML() will keep the HTML tags but it will also keep the parent tag" source : http://php.net/manual/fr/function.si...-load-file.php un exemple effectué par Kyle

Après je ne sais pas s'il est mieux de faire avec un str_replace ou non moi là je préfèrerais sans après si' quelqu'un me dit que c'est mieux avec j'aimerais bien savoir le pourquoi ... si vous avez des infos là dessus je suis tout ouïe .

Sinon pour le code pour ceux que ca peu intéresser (avec au final changement du xpath vu que je ne désire que l'attribut href):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
$basePhoto = $xmlArticle->xpath('//NewsComponent[@Duid="photo0"]/NewsComponent[Role/@FormalName="Thumbnail"]/ContentItem/@Href');
 
   if (!$basePhoto) {
        echo "Erreur lors du chargement du chemin XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }else{
          //print_r($basePhoto);
 
          $donneeResult =  $basePhoto[0]['Href'];
        }
      print $donneeResult;
Voila je ne trouve pas pour l'instant ou il faut cliquez ou autre pour dire que c'est résolu donc au cas si quelqu'un sait je le remercie ^^
damien.s est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h47.


 
 
 
 
Partenaires

Hébergement Web