mozilla

Comparaison de révisions

Introduction à l'utilisation de XPath avec JavaScript

Change Revisions

Révision 275685 :

Révision 275685 par Julien.stuby le

Révision 222814 :

Révision 222814 par Julien.stuby le

Titre :
Introduction à l'utilisation de XPath avec JavaScript
Introduction à l'utilisation de XPath avec JavaScript
Identifiant d'URL :
Introduction_à_l'utilisation_de_XPath_avec_JavaScript
Introduction_à_l'utilisation_de_XPath_avec_JavaScript
Étiquettes :
DOM, XML, XSLT, Extensions, XPath, Développement_Web, Transformations_XML_avec_XSLT
Contenu :

Revision 275685
Revision 222814
t7    <p>t
8      Ce document décrit l'interface pour utiliser <a href="/fr/X
>Path" title="fr/XPath">XPath</a> dans JavaScript, que ce soit en  
>interne, dans les extensions et depuis les sites Web. Mozilla imp 
>lémente une partie importante de <a class="external" href="http:/ 
>/www.w3.org/TR/DOM-Level-3-XPath/xpath.html">DOM 3 XPath (en)</a> 
>. Cela signifie que les expressions XPath peuvent être utilisées  
>sur des documents HTML et XML. 
9    </p>
10    <p>
11      La principale interface pour l'utilisation de XPath est la 
>fonction <a href="/Fr/DOM/Document.evaluate" title="fr/DOM/docume 
>nt.evaluate">evaluate</a> de l'objet <a href="/fr/DOM/document" t 
>itle="fr/DOM/document">document</a>. 
12    </p>
13    <h2 id="document.evaluate" name="document.evaluate">
14      document.evaluate
15    </h2>
16    <p>
17      Cette méthode évalue les expressions <a href="/fr/XPath" ti
>tle="fr/XPath">XPath</a> dans un document <a href="/fr/XML" title 
>="fr/XML">XML</a> (y compris les documents HTML), et retourne un  
>objet <a class="internal" href="/Fr/XPathResult" title="Fr/XPathR 
>esult">XPathResult</a>, qui peut être un nœud unique ou un ensemb 
>le de nœuds. La documentation existante sur cette méthode se trou 
>ve à la page <a href="/Fr/DOM/Document.evaluate" title="fr/DOM/do 
>cument.evaluate">DOM:document.evaluate</a> mais elle est plutôt s 
>uccincte comparée à nos besoins actuels. Nous l'examinerons de fa 
>çon plus complète dans la suite de ce document. 
18    </p>
19    <pre class="eval">
20var xpathResult = document.evaluate( xpathExpression, contextNode
>, namespaceResolver, resultType, result ); 
21</pre>
22    <h3 id="Param.C3.A8tres" name="Param.C3.A8tres">
23      Paramètres
24    </h3>
25    <p>
26      La fonction <a href="/Fr/DOM/Document.evaluate" title="fr/D
>OM/document.evaluate">evaluate</a> prend cinq arguments au total& 
>nbsp;: 
27    </p>
28    <dl>
29      <dt>
30        <code>xpathExpression</code>
31      </dt>
32      <dd>
33        Une chaîne contenant l'expression XPath à évaluer.
34      </dd>
35      <dt>
36        <code>contextNode</code>
37      </dt>
38      <dd>
39        Un nœud du document pour lequel l'expression <code>xpathE
>xpression</code> doit être évaluée, ainsi que l'ensemble de ses d 
>escendants. Le nœud <a href="/fr/DOM/document" title="fr/DOM/docu 
>ment">document</a> est le plus couramment utilisé. 
40      </dd>
41      <dt>
42        <code>namespaceResolver</code>
43      </dt>
44      <dd>
45        Une fonction à laquelle sera passé tout préfixe d'espace 
>de nommage contenu dans l'expression <code>xpathExpression</code> 
> et qui renvoie une chaîne représentant l'URI de l'espace de nomm 
>age associé à ce préfixe. Cela permet la conversion entre le préf 
>ixe utilisé dans les expressions XPath et les différents préfixes 
> éventuellement utilisés dans le document. Cette fonction peut êt 
>re&nbsp;: 
46      </dd>
47    </dl>
48    <ul>
49      <li>
50        <a href="#Impl.C3.A9mentation_d.27un_r.C3.A9solveur_d.27e
>spaces_de_nommage_par_d.C3.A9faut">Créée</a> à l'aide de la métho 
>de <code><a href="/fr/DOM/document.createNSResolver" title="fr/DO 
>M/document.createNSResolver">createNSResolver</a></code> d'un obj 
>et <code><a class="external" href="http://www.xulplanet.com/refer 
>ences/objref/XPathEvaluator.html">XPathEvaluator</a></code>. C'es 
>t la solution à utiliser à peu près tout le temps. 
51      </li>
52      <li>Une valeur <code>null</code>, qui peut être utilisé pou
>r les documents HTML ou lorsqu'aucun préfixe n'est utilisé. Remar 
>quez que si l'expression <code>xpathExpression</code> contient un 
> préfixe d'espace de nommage cela déclenchera une exception <code 
>>DOMException</code> portant le code <code>NAMESPACE_ERR</code>. 
53      </li>
54      <li>Une fonction personnalisée définie par l'utilisateur. V
>oir la section <a href="#Impl.C3.A9mentation_d.27un_r.C3.A9solveu 
>r_d.27espace_de_nommage_personnalis.C3.A9">Implémentation d'un ré 
>solveur d'espace de nommage personnalisé</a> dans l'annexe pour p 
>lus de détails. 
55      </li>
56    </ul>
57    <dl>
58      <dt>
59        <code>resultType</code>
60      </dt>
61      <dd>
62        Une <a href="#Constantes_d.C3.A9finies_de_XPathResult">co
>nstante</a> qui définit le type de résultat à renvoyer comme résu 
>ltat de l'évaluation. La constante la plus courante est <code>XPa 
>thResult.ANY_TYPE</code> qui renverra un résultat du type le plus 
> naturel par rapport à l'expression XPath. Une section de l'annex 
>e contient une liste complète des <a href="#Constantes_d.C3.A9fin 
>ies_de_XPathResult">constantes disponibles</a>. Elles sont expliq 
>uées dans la section <a href="#D.C3.A9finition_du_type_de_retour" 
>>#Définition du type de retour</a> ci-dessous. 
63      </dd>
64      <dt>
65        <code>result</code>&nbsp;
66      </dt>
67      <dd>
68        Soit un objet <code>XPathResult</code> existant qui sera 
>réutilisé pour contenir les résultats, soit la valeur <code>null< 
>/code> qui peut être utilisée pour créer un nouvel objet <code>XP 
>athResult</code>. 
69      </dd>
70    </dl>
71    <h3 id="Valeur_de_retour" name="Valeur_de_retour">
72      Valeur de retour
73    </h3>
74    <p>
75      Renvoie <code>xpathResult</code>, qui est un objet <code>XP
>athResult</code> du type <a href="#D.C3.A9finition_du_type_de_ret 
>our">défini</a> dans le paramètre <code>resultType</code>. L'inte 
>rface <code>XPathResult</code> est définie dans ce <a class="exte 
>rnal" href="http://lxr.mozilla.org/seamonkey/source/dom/public/id 
>l/xpath/nsIDOMXPathResult.idl">document</a>. 
76    </p>
77    <h3 id="Impl.C3.A9mentation_d.27un_r.C3.A9solveur_d.27espaces
>_de_nommage_par_d.C3.A9faut" name="Impl.C3.A9mentation_d.27un_r.C 
>3.A9solveur_d.27espaces_de_nommage_par_d.C3.A9faut"> 
78      Implémentation d'un résolveur d'espaces de nommage par défa
>ut 
79    </h3>
80    <p>
81      On crée un résolveur d'espace de nommage à l'aide de la mét
>hode <code>createNSResolver</code> de l'objet <a href="/fr/DOM/do 
>cument" title="fr/DOM/document">document</a>. 
82    </p>
83    <pre class="eval">
84var nsResolver = document.createNSResolver( contextNode.ownerDocu
>ment == null ? contextNode.documentElement : contextNode.ownerDoc 
>ument.documentElement ); 
85</pre>
86    <p>
87      <span class="comment">Ou alternativement en utilisant la mé
>thode &lt;code&gt;createNSResolver&lt;/code&gt; d'un objet &lt;co 
>de&gt;XPathEvaluator&lt;/code&gt;. &lt;pre&gt; var xpEvaluator =  
>new XPathEvaluator(); var nsResolver = xpEvaluator.createNSResolv 
>er( contextNode.ownerDocument == null&nbsp;? contextNode.document 
>Element&nbsp;: contextNode.ownerDocument.documentElement ); &lt;/ 
>pre&gt;</span> On lui passe ensuite <code>document.evaluate</code 
>>, la variable <code>nsResolver</code> comme paramètre <code>name 
>spaceResolver</code>. 
88    </p>
89    <p>
90      <span class="comment">véracité du paragraphe suivant à véri
>fier avec la doc du w3c</span> Notez que XPath définit que les <c 
>ode>QNames</code> sans préfixe correspondent uniquement aux éléme 
>nts de l'espace de nommage <code>null</code>. Il n'existe aucun m 
>oyen dans XPath pour récupérer l'espace de nommage par défaut. Po 
>ur coupler des éléments ou des attributs dans un espace de nommag 
>e non nul, vous devrez détecter les noms préfixés, et créer un ré 
>solveur d'espace de nommage qui fera correspondre le préfixe avec 
> l'espace de nommage. Vous en saurez plus sur la façon de <a href 
>="#Impl.C3.A9mentation_d.27un_r.C3.A9solveur_d.27espace_de_nommag 
>e_personnalis.C3.A9">créer un résolveur d'espace de nommage perso 
>nnalisé</a> ci-dessous. 
91    </p>
92    <h3 id="D.C3.A9finition_du_type_de_retour" name="D.C3.A9finit
>ion_du_type_de_retour"> 
93      Définition du type de retour
94    </h3>
95    <p>
96      La variable <code>xpathResult</code> renvoyée par <code>doc
>ument.evaluate</code> peut être composée de nœuds individuels (<a 
> href="#Types_simples">types simples</a>), ou un groupe de nœuds  
>(<a href="#Types_d.27ensembles_de_n.C5.93uds">types d'ensembles d 
>e nœuds</a>). 
97    </p>
98    <h4 id="Types_simples" name="Types_simples">
99      Types simples
100    </h4>
101    <p>
102      Lorsque le type de résultat spécifié dans <code>resultType<
>/code> est soit&nbsp;: 
103    </p>
104    <ul>
105      <li>
106        <code>NUMBER_TYPE</code> — un nombre
107      </li>
108      <li>
109        <code>STRING_TYPE</code> — une chaîne
110      </li>
111      <li>
112        <code>BOOLEAN_TYPE</code> — une valeur booléenne
113      </li>
114    </ul>
115    <p>
116      On obtiendra la valeur de retour de l'expression en accédan
>t respectivement aux propriétés suivantes de l'objet <code>XPathR 
>esult</code>&nbsp;: 
117    </p>
118    <ul>
119      <li>
120        <code>numberValue</code>
121      </li>
122      <li>
123        <code>stringValue</code>
124      </li>
125      <li>
126        <code>booleanValue</code>
127      </li>
128    </ul>
129    <h5 id="Exemple" name="Exemple">
130      Exemple
131    </h5>
132    <p>
133      Cet exemple utilise l'expression XPath <code><a href="/fr/X
>Path/Fonctions/count" title="fr/XPath/Fonctions/count">count(//p) 
></a></code> pour obtenir le nombre d'éléments <code>&lt;p&gt;</co 
>de> présents dans le document HTML&nbsp;: 
134    </p>
135    <pre>
136var paragraphCount = document.evaluate( 'count(//p)', document, n
>ull, XPathResult.ANY_TYPE, null ); 
137 
138alert( 'Ce document contient ' + paragraphCount.numberValue + ' é
>léments de paragraphe' ); 
139</pre>
140    <p>
141      Même si JavaScript convertira un nombre en chaîne pour l'af
>fichage, l'interface XPath ne fera pas automatiquement la convers 
>ion du résultat numérique si la propriété <code>stringValue</code 
>> est demandée. Ainsi, le code suivant ne fonctionnera <strong>pa 
>s</strong>&nbsp;: 
142    </p>
143    <pre>
144var paragraphCount = document.evaluate('count(//p)', document, nu
>ll, XPathResult.ANY_TYPE, null ); 
145 
146alert( 'Ce document contient ' + paragraphCount.stringValue + ' é
>léments de paragraphe' ); 
147</pre>
148    <p>
149      Au lieu de cela, il déclenchera une exception pourtant le c
>ode <code>NS_DOM_TYPE_ERROR</code>. 
150    </p>
151    <h4 id="Types_d.27ensembles_de_n.C5.93uds" name="Types_d.27en
>sembles_de_n.C5.93uds"> 
152      Types d'ensembles de nœuds
153    </h4>
154    <p>
155      L'objet <code>XPathResult</code> permet de renvoyer les ens
>embles de nœuds sous la forme de trois types principaux&nbsp;: 
156    </p>
157    <ul>
158      <li>
159        <a href="#It.C3.A9rateurs">Itérateurs</a>
160      </li>
161      <li>
162        <a href="#Snapshots">Snapshots</a>
163      </li>
164      <li>
165        <a href="#Premiers_n.C5.93uds">Premiers nœuds</a>
166      </li>
167    </ul>
168    <h5 id="It.C3.A9rateurs" name="It.C3.A9rateurs">
169      Itérateurs
170    </h5>
171    <p>
172      Lorsque le type de résultat spécifié dans le paramètre <cod
>e>resultType</code> est soit&nbsp;: 
173    </p>
174    <ul>
175      <li>
176        <code>UNORDERED_NODE_ITERATOR_TYPE</code>
177      </li>
178      <li>
179        <code>ORDERED_NODE_ITERATOR_TYPE</code>
180      </li>
181    </ul>
182    <p>
183      L'objet <code>XPathResult</code> renvoyé sera un ensemble d
>e nœuds correspondant à l'expression se comportant comme un itéra 
>teur. On pourra accéder individuellement aux nœuds qu'il contient 
> en utilisant la méthode <a class="internal" href="/Fr/XPathResul 
>t.IterateNext()" title="Fr/XPathResult.IterateNext()"><code>itera 
>teNext()</code></a> de l'objet <code>XPathResult</code>. 
184    </p>
185    <p>
186      Lorsque tous les nœuds ont été parcourus, <a class="interna
>l" href="/Fr/XPathResult.IterateNext()" title="Fr/XPathResult.Ite 
>rateNext()"><code>iterateNext()</code></a> renverra <code>null</c 
>ode>. 
187    </p>
188    <p>
189      Notez cependant que si le document le document est modifié 
>(l'arbre du document est modifié) entre les itérations, l'itérate 
>ur sera invalidé et la propriété <code>invalidIteratorState</code 
>> de <code>XPathResult</code> deviendra <code>true</code>. Une ex 
>ception <code>NS_ERROR_DOM_INVALID_STATE_ERR</code> sera égalemen 
>t déclenchée. 
190    </p>
191    <h6 id="Exemple_d.27it.C3.A9rateur" name="Exemple_d.27it.C3.A
>9rateur"> 
192      Exemple d'itérateur
193    </h6>
194    <pre>
195var iterator = document.evaluate('//phoneNumber', documentNode, n
>ull, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null ); 
196 
197try {
198  var thisNode = iterator.iterateNext();
199  
200  while (thisNode) {
201    alert( thisNode.textContent );
202    thisNode = iterator.iterateNext();
203  }     
204}
205catch (e) {
206  dump( 'Erreur : L'arbre du document a été modifié pendant l'ité
>ration ' + e ); 
207}
208</pre>
209    <h5 id="Snapshots" name="Snapshots">
210      Snapshots
211    </h5>
212    <p>
213      Lorsque le type de résultat spécifié dans le paramètre <cod
>e>resultType</code> est l'une des valeurs suivantes&nbsp;: 
214    </p>
215    <ul>
216      <li>
217        <code>UNORDERED_NODE_SNAPSHOT_TYPE</code>
218      </li>
219      <li>
220        <code>ORDERED_NODE_SNAPSHOT_TYPE</code>
221      </li>
222    </ul>
223    <p>
224      L'objet <code>XPathResult</code> renvoyé sera un ensemble s
>tatique de nœuds correspondant à l'expression. L'accès à chaque n 
>œud se fera au travers de la méthode <a class="internal" href="/F 
>r/XPathResult.SnapshotItem()" title="Fr/XPathResult.SnapshotItem( 
>)"><code>snapshotItem(itemNumber)</code></a> de l'objet <code>XPa 
>thResult</code>, où <code>itemNumber</code> est l'indice du nœud  
>à récupérer. On peut accéder au nombre total de nœuds contenus da 
>ns l'ensemble par la propriété <code>snapshotLength</code>. 
225    </p>
226    <p>
227      Les snapshots ne changent pas avec les mutations du documen
>t. Aussi, contrairement aux itérateurs, le snapshot ne deviendra  
>pas invalide mais peut ne plus correspondre au document actuel. P 
>ar exemple, des nœuds peuvent avoir été déplacés, il peut conteni 
>r des nœuds qui n'existent plus ou de nouveaux nœuds peuvent avoi 
>r été ajoutés. 
228    </p>
229    <h6 id="Exemple_de_snapshot" name="Exemple_de_snapshot">
230      Exemple de snapshot
231    </h6>
232    <pre>
233var nodesSnapshot = document.evaluate('//phoneNumber', documentNo
>de, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); 
234 
235for ( var i=0 ; i &lt; nodesSnapshot.snapshotLength; i++ )
236{
237  dump( nodesSnapshot.snapshotItem(i).textContent );
238}
239</pre>
240    <h5 id="Premier_n.C5.93ud" name="Premier_n.C5.93ud">
241      Premier nœud
242    </h5>
243    <p>
244      Lorsque le type de résultat spécifié dans le paramètre <cod
>e>resultType</code> est l'une des valeurs suivantes&nbsp;: 
245    </p>
246    <ul>
247      <li>
248        <code>ANY_UNORDERED_NODE_TYPE</code>
249      </li>
250      <li>
251        <code>FIRST_ORDERED_NODE_TYPE</code>
252      </li>
253    </ul>
254    <p>
255      L'objet <code>XPathResult</code> renvoyé n'est que le premi
>er nœud trouvé correspondant à l'expression XPath. On peut y accé 
>der à l'aide de la propriété <code>singleNodeValue</code> de l'ob 
>jet <code>XPathResult</code>. Celle-ci vaudra <code>null</code> s 
>i l'ensemble de nœuds est vide. 
256    </p>
257    <p>
258      Notez que pour le sous-type non ordonné (le premier), le nœ
>ud unique renvoyé ne sera peut-être pas le premier nœud dans l'or 
>dre du document. Dans le cas du sous-type ordonné (le second), vo 
>us pouvez être sûr d'obtenir le premier nœud correspond dans l'or 
>dre du document. 
259    </p>
260    <h6 id="Exemple_de_premier_n.C5.93ud" name="Exemple_de_premie
>r_n.C5.93ud"> 
261      Exemple de premier nœud
262    </h6>
263    <pre>
264var firstPhoneNumber = document.evaluate('//phoneNumber', documen
>tNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); 
265 
266dump( 'Le premier numéro de téléphone trouvé est ' + firstPhoneNu
>mber.singleNodeValue.textContent ); 
267</pre>
268    <h4 id="La_constante_ANY_TYPE" name="La_constante_ANY_TYPE">
269      La constante ANY_TYPE
270    </h4>
271    <p>
272      Lorsque le type de résultat spécifié dans le paramètre <cod
>e>resultType</code> est la valeur <code>ANY_TYPE</code>, l'objet  
><code>XPathResult</code> renvoyé pourra être de n'importe quel ty 
>pe, c'est-à-dire du type résultant le plus naturellement de l'éva 
>luation de l'expression. 
273    </p>
274    <p>
275      Il peut s'agir de n'importe lequel des types simples (<code
>>NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE</code>), <strong>mais</st 
>rong> si le type du résultat retourné est un ensemble de nœuds al 
>ors il ne pourra être <strong>que</strong> du type <code>UNORDERE 
>D_NODE_ITERATOR_TYPE</code>. 
276    </p>
277    <p>
278      Pour déterminer le type utilisé après l'évaluation, on util
>isera la propriété <code>resultType</code> de l'objet <code>XPath 
>Result</code>. Les valeurs <a href="#Constantes_d.C3.A9finies_de_ 
>XPathResult">constantes</a> de cette propriété sont définies dans 
> l'annexe. 
279    </p>
280    <p>
281      <span class="comment">None Yet =====Exemple Any_Type===== &
>lt;pre&gt; &lt;/pre&gt;</span> 
282    </p>
283    <h2 id="Exemples" name="Exemples">
284      Exemples
285    </h2>
286    <h3 id="Dans_un_document_HTML" name="Dans_un_document_HTML">
287      Dans un document HTML
288    </h3>
289    <p>
290      Le code suivant est destiné à être inséré dans un fragment 
>JavaScript intégré ou lié au document HTML qui devra être évalué  
>par l'expression XPath. 
291    </p>
292    <p>
293      Pour extraire tous les éléments d'en-tête <code>&lt;h2&gt;<
>/code> d'un document HTML à l'aide de XPath, l'expression <code>x 
>pathExpression</code> est simplement '<code>//h2</code>', où <cod 
>e>//</code> est l'opérateur descendant récursif (ou RDO) qui corr 
>espond aux éléments dont la propriété <code>nodeName</code> est < 
>code>h2</code> n'importe où dans l'arbre du document. Le code com 
>plet pour cela est&nbsp;: <span class="comment">link to introduct 
>ory xpath doc</span> 
294    </p>
295    <pre class="eval">
296var headings = document.evaluate('//h2', document, null, XPathRes
>ult.ANY_TYPE, null ); 
297</pre>
298    <p>
299      Notez que, comme HTML ne possède pas d'espace de nommage, <
>code>null</code> a été passé comme paramètre <code>namespaceResol 
>ver</code>. 
300    </p>
301    <p>
302      Comme le but est de chercher les en-têtes dans l'intégralit
>é du document, on utilise l'objet <a href="/fr/DOM/document" titl 
>e="fr/DOM/document">document</a> lui-même comme paramètre <code>c 
>ontextNode</code>. 
303    </p>
304    <p>
305      Le résultat de cette expression est un objet <code>XPathRes
>ult</code>. Pour connaître le type de résultat renvoyé, il convie 
>nt d'évaluer la propriété <code>resultType</code> de l'objet renv 
>oyé. Dans notre cas, il sera évalué à <code>4</code>, c'est donc  
>un <code>UNORDERED_NODE_ITERATOR_TYPE</code>. Il s'agit du type d 
>e retour par défaut lorsque le résultat de l'expression XPath est 
> un ensemble de nœuds. Il permet d'accéder à un seul nœud à la fo 
>is et ne renvoie pas les nœuds dans un ordre particulier. Pour ac 
>céder à ceux-ci, on utilise la méthode <code>iterateNext()</code> 
> de l'objet renvoyé&nbsp;: 
306    </p>
307    <pre>
308var thisHeading = headings.iterateNext();
309 
310var alertText = 'Les en-têtes de niveau 2 présents dans ce docume
>nt sont :\n' 
311 
312while (thisHeading) {
313  alertText += thisHeading.textContent + '\n';
314  thisHeading = headings.iterateNext();
315}
316</pre>
317    <p>
318      Une fois l'itération effectuée sur un nœud, nous avons accè
>s à toutes les <a href="/fr/Interfaces_DOM" title="fr/Interfaces_ 
>DOM">Interfaces DOM</a> standards de ce nœud. Après avoir parcour 
>u tous les éléments <code>h2</code> renvoyés à partir de notre ex 
>pression, chaque nouvel appel à <code>iterateNext()</code> donner 
>a <code>null</code>. 
319    </p>
320    <h3 id=".C3.89valuation_d.27un_document_XML_appartenant_.C3.A
>0_une_extension" name=".C3.89valuation_d.27un_document_XML_appart 
>enant_.C3.A0_une_extension"> 
321      Évaluation d'un document XML appartenant à une extension
322    </h3>
323    <p>
324      L'exemple suivant utilise un document XML situé à l'adresse
> <code><a class=" external" href="chrome://yourextension/content/ 
>peopleDB.xml" rel="freelink">chrome://yourextension/content/peopl 
>eDB.xml</a></code>. 
325    </p>
326    <pre>
327&lt;?xml version="1.0"?&gt;
328&lt;people xmlns:xul = "http://www.mozilla.org/keymaster/gatekeep
>er/there.is.only.xul" &gt; 
329  &lt;person&gt;
330        &lt;name first="george" last="bush" /&gt;
331        &lt;address street="1600 pennsylvania avenue" city="washi
>ngton" country="usa"/&gt; 
332        &lt;phoneNumber&gt;202-456-1111&lt;/phoneNumber&gt;
333  &lt;/person&gt;
334  &lt;person&gt;
335        &lt;name first="tony" last="blair" /&gt;
336        &lt;address street="10 downing street" city="london" coun
>try="uk"/&gt; 
337        &lt;phoneNumber&gt;020 7925 0918&lt;/phoneNumber&gt;
338  &lt;/person&gt;
339&lt;/people&gt;
340</pre>
341    <p>
342      Pour rendre les contenus du document XML accessibles depuis
> l'extension, on crée un objet <code><a href="/fr/XMLHttpRequest" 
> title="fr/XMLHttpRequest">XMLHttpRequest</a></code> pour charger 
> le document de façon synchrone. La variable <code>xmlDoc</code>  
>contiendra le document comme un objet <code><a href="/fr/XMLDocum 
>ent" title="fr/XMLDocument">XMLDocument</a></code> sur lequel on  
>pourra utiliser la méthode <code>evaluate</code>. 
343    </p>
344    <p>
345      <em>JavaScript utilisé dans les documents XUL/js des extens
>ions.</em> 
346    </p>
347    <pre>
348var req = new XMLHttpRequest();
349 
350req.open("GET", "chrome://yourextension/content/peopleDB.xml", fa
>lse);  
351req.send(null);
352 
353var xmlDoc = req.responseXML;           
354 
355var nsResolver = xmlDoc.createNSResolver( xmlDoc.ownerDocument ==
> null ? xmlDoc.documentElement : xmlDoc.ownerDocument.documentEle 
>ment); 
356 
357var personIterator = xmlDoc.evaluate('//person', xmlDoc, nsResolv
>er, XPathResult.ANY_TYPE, null ); 
358</pre>
359    <h2 id="Annexe" name="Annexe">
360      Annexe
361    </h2>
362    <h4 id="Impl.C3.A9mentation_d.27un_r.C3.A9solveur_d.27espace_
>de_nommage_personnalis.C3.A9" name="Impl.C3.A9mentation_d.27un_r. 
>C3.A9solveur_d.27espace_de_nommage_personnalis.C3.A9"> 
363      Implémentation d'un résolveur d'espace de nommage personnal
>isé 
364    </h4>
365    <p>
366      Cet exemple ne sert que d'illustration. Cette fonction néce
>ssitera de prendre les préfixes d'espaces de nommage depuis la <c 
>ode>xpathExpression</code> et retourne l'URI correspondante à ces 
> préfixes. Par exemple, l'expression&nbsp;: 
367    </p>
368    <pre>
369'//xhtml:td/mathml:math'
370</pre>
371    <p>
372      sélectionnera toutes les expressions <a href="/fr/MathML" t
>itle="fr/MathML">MathML</a> qui sont les descendantes des élément 
>s (X)HTML de cellules de tableau. 
373    </p>
374    <p>
375      Afin d'associer le préfixe <code>mathml:</code> avec l'URI 
>d'espace de nommage '<code><a class=" external" href="http://www. 
>w3.org/1998/Math/MathML" rel="freelink">http://www.w3.org/1998/Ma 
>th/MathML</a></code>' et <code>xhtml:</code> avec l'URI <code><a  
>class=" external" href="http://www.w3.org/1999/xhtml" rel="freeli 
>nk">http://www.w3.org/1999/xhtml</a></code>, nous fournissons une 
> fonction&nbsp;: 
376    </p>
377    <pre>
378function nsResolver(prefix) {
379  var ns = {
380    'xhtml' : 'http://www.w3.org/1999/xhtml',
381    'mathml': 'http://www.w3.org/1998/Math/MathML'
382  };
383  return ns[prefix] || null;
384}
385</pre>
386    <p>
387      L'appel à <code>document.evaluate</code> ressemblera alors 
>à&nbsp;: 
388    </p>
389    <pre class="eval">
390document.evaluate( '//xhtml:td/mathml:math', document, nsResolver
>, XPathResult.ANY_TYPE, null ); 
391</pre>
392    <h4 id="Impl.C3.A9mentation_d.27un_espace_de_nommage_par_d.C3
>.A9faut_pour_les_documents_XML" name="Impl.C3.A9mentation_d.27un_ 
>espace_de_nommage_par_d.C3.A9faut_pour_les_documents_XML"> 
393      Implémentation d'un espace de nommage par défaut pour les d
>ocuments XML 
394    </h4>
395    <p>
396      Comme nous l'avons vu précédemment dans le section <a href=
>"#Impl.C3.A9mentation_d.27un_r.C3.A9solveur_d.27espaces_de_nommag 
>e_par_d.C3.A9faut">#Implémentation d'un résolveur d'espaces de no 
>mmage par défaut</a>, le résolveur par défaut ne gère pas l'espac 
>e de nommage par défaut pour les documents XML. Par exemple, avec 
> ce document&nbsp;: 
397    </p>
398    <pre>
399&lt;?xml version="1.0" encoding="UTF-8"?&gt;
400&lt;feed xmlns="http://www.w3.org/2005/Atom"&gt;
401    &lt;entry /&gt;
402    &lt;entry /&gt;
403    &lt;entry /&gt;
404&lt;/feed&gt;
405</pre>
406    <p>
407      <code>doc.evaluate('//entry', doc, nsResolver, XPathResult.
>ANY_TYPE, null)</code> retournera un ensemble vide, où <code>nsRe 
>solver</code> est le résolveur retourné par <code>createNSResolve 
>r</code>. Passé un résolveur <code>null</code> ne fonctionne pas  
>mieux. 
408    </p>
409    <p>
410      Une alternative possible est de créer un résolveur personna
>lisé qui retournera le bon espace de nommage (l'espace de nommage 
> <em>Atom</em> dans ce cas). Par exemple&nbsp;: 
411    </p>
412    <pre>
413 function resolver() {
414     return 'http://www.w3.org/2005/Atom';
415 }
416 doc.evaluate('//entry', doc, resolver, XPathResult.ANY_TYPE, nul
>l) 
417</pre>
418    <p>
419      Un résolveur plus complexe sera nécessaire si le document u
>tilise de multiple espaces de nommage. 
420    </p>
421    <h4 id="Constantes_d.C3.A9finies_de_XPathResult" name="Consta
>ntes_d.C3.A9finies_de_XPathResult"> 
422      Constantes définies de XPathResult
423    </h4>
424    <table class="standard-table">
425      <tbody>
426        <tr>
427          <td class="header">
428            Constante du type de résultat
429          </td>
430          <td class="header">
431            Valeur
432          </td>
433          <td class="header">
434            Description
435          </td>
436        </tr>
437        <tr>
438          <td>
439            ANY_TYPE
440          </td>
441          <td>
442            0
443          </td>
444          <td>
445            Un ensemble contenant n'importe quel type qui résulte
> naturellement de l'évaluation de l'expression. Notez que si c'es 
>t un ensemble de noeuds qui doit être retourné, alors le type rés 
>ultant sera toujours UNORDERED_NODE_ITERATOR_TYPE. 
446          </td>
447        </tr>
448        <tr>
449          <td>
450            NUMBER_TYPE
451          </td>
452          <td>
453            1
454          </td>
455          <td>
456            Un résultat contenant un seul nombre. C'est utile, pa
>r exemple, dans une expression XPath utilisant la fonction <code> 
>count()</code>. 
457          </td>
458        </tr>
459        <tr>
460          <td>
461            STRING_TYPE
462          </td>
463          <td>
464            2
465          </td>
466          <td>
467            Un résultat contenant une seule chaîne de caractère.
468          </td>
469        </tr>
470        <tr>
471          <td>
472            BOOLEAN_TYPE
473          </td>
474          <td>
475            3
476          </td>
477          <td>
478            Un résultat contenant une seule valeur booléenne. C'e
>st utile, par exemple, dans une expression XPath utilisant la fon 
>ction <code>not()</code>. 
479          </td>
480        </tr>
481        <tr>
482          <td>
483            UNORDERED_NODE_ITERATOR_TYPE
484          </td>
485          <td>
486            4
487          </td>
488          <td>
489            Un ensemble de nœuds contenant tous les nœuds vérifia
>nt l'expression. Les nœuds ne sont pas nécessairement dans le mêm 
>e ordre que celui dans lequel ils apparaissent dans le document. 
490          </td>
491        </tr>
492        <tr>
493          <td>
494            ORDERED_NODE_ITERATOR_TYPE
495          </td>
496          <td>
497            5
498          </td>
499          <td>
500            Un ensemble de nœuds contenant tous les nœuds vérifia
>nt l'expression. Les nœuds du résultat sont dans le même ordre qu 
>e celui dans lequel ils apparaissent dans le document. 
501          </td>
502        </tr>
503        <tr>
504          <td>
505            UNORDERED_NODE_SNAPSHOT_TYPE
506          </td>
507          <td>
508            6
509          </td>
510          <td>
511            Un ensemble de nœuds contenant les snapshots de tous 
>les nœuds vérifiant l'expression. Les nœuds ne sont pas nécessair 
>ement dans le même ordre que celui dans lequel ils apparaissent d 
>ans le document. 
512          </td>
513        </tr>
514        <tr>
515          <td>
516            ORDERED_NODE_SNAPSHOT_TYPE
517          </td>
518          <td>
519            7
520          </td>
521          <td>
522            Un ensemble de nœuds contenant les snapshots de tous 
>les nœuds vérifiant l'expression. Les nœuds du résultat sont dans 
> le même ordre que celui dans lequel ils apparaissent dans le doc 
>ument. 
523          </td>
524        </tr>
525        <tr>
526          <td>
527            ANY_UNORDERED_NODE_TYPE
528          </td>
529          <td>
530            8
531          </td>
532          <td>
533            Un ensemble de nœuds contenant un seul nœud vérifiant
> l'expression. Le nœud n'est pas nécessairement le premier dans l 
>'ordre du document qui correspond à l'expression. 
534          </td>
535        </tr>
536        <tr>
537          <td>
538            FIRST_ORDERED_NODE_TYPE
539          </td>
540          <td>
541            9
542          </td>
543          <td>
544            Un ensemble de nœuds contenant le premier nœud du doc
>ument vérifiant l'expression. 
545          </td>
546        </tr>
547      </tbody>
548    </table>
549    <div class="originaldocinfo">
550      <h2 id="Informations_sur_le_document_original" name="Inform
>ations_sur_le_document_original"> 
551        Informations sur le document original
552      </h2>
553      <ul>
554        <li>Document original&nbsp;: <a class="external" href="ht
>tp://www-xray.ast.cam.ac.uk/~jgraham/mozilla/xpath-tutorial.html" 
>>Mozilla XPath Tutorial (en)</a> 
555        </li>
556        <li>Auteur(s)&nbsp;: James Graham.
557        </li>
558        <li>Autre(s) contributeur(s): James Thompson.
559        </li>
560        <li>Dernière mise à jour&nbsp;: 25 mars 2006
561        </li>
562      </ul>
563    </div>
564    <p>
565      <span class="comment">Interwiki Languages Links</span>
566    </p>
567    <p>
568      &nbsp;
569    </p>
570    <p>
571      {{ languages( { "en": "en/Introduction_to_using_XPath_in_Ja
>vaScript", "ja": "ja/Introduction_to_using_XPath_in_JavaScript",  
>"ko": "ko/Introduction_to_using_XPath_in_JavaScript", "pl": "pl/W 
>prowadzenie_do_korzystania_z_XPath_w_j\u0119zyku_JavaScript", "zh 
>-cn": "cn/Introduction_to_using_XPath_in_JavaScript" } ) }} 
572    </p>

Retour à l'historique