Zend_Dom-Query.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.dom.query">
  5. <title>Zend_Dom_Query</title>
  6. <para>
  7. <classname>Zend_Dom_Query</classname> fournit des mécanismes pour requêter dans les
  8. documents <acronym>XML</acronym> et (X)HTML en utilisant soit XPath ou les sélecteurs <acronym>CSS</acronym>. Il a été développé
  9. pour faciliter les tests fonctionnels des applications <acronym>MVC</acronym>, mais pourrait également être
  10. employé pour le développement rapide de "screen scrapers".
  11. </para>
  12. <para>
  13. La notation de type sélecteur <acronym>CSS</acronym> est fournie comme notation plus simple et plus
  14. familière pour les développeurs Web à utiliser lors de la requête de documents ayant une
  15. structure de type <acronym>XML</acronym>. La notation devrait être familière pour n'importe qui ayant écrit
  16. des feuilles de styles <acronym>CSS</acronym> ou ayant utiliser des librairies Javascript qui fournissent pour
  17. sélectionner des noeuds en utilisant des sélecteurs <acronym>CSS</acronym> (
  18. <ulink url="http://prototypejs.org/api/utility/dollar-dollar">Prototype's $$()</ulink>et
  19. <ulink url="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">Dojo's
  20. dojo.query</ulink>ont tous les deux inspirer ce composant).
  21. </para>
  22. <sect2 id="zend.dom.query.operation">
  23. <title>Aspect théorique</title>
  24. <para>
  25. Pour utiliser <classname>Zend_Dom_Query</classname>, vous instanciez un objet
  26. <classname>Zend_Dom_Query</classname>, en fournissant optionnellement un document à
  27. analyser (sous la forme d'une chaîne). Une fois que vous avez un document, vous pouvez
  28. utiliser indifféremment les méthodes <methodname>query()</methodname> ou
  29. <methodname>queryXpath()</methodname>&#160;; chaque méthode retournera un objet
  30. <classname>Zend_Dom_Query_Result</classname> avec tout noeud trouvé.
  31. </para>
  32. <para>
  33. La différence principale entre <classname>Zend_Dom_Query</classname> et
  34. l'utilisation de DOMDocument + DOMXPath est la possibilité de requêter avec les
  35. sélecteurs <acronym>CSS</acronym>. Vous pouvez utiliser n'importe quel élément suivant, dans n'importe
  36. quelle combinaison&#160;:
  37. </para>
  38. <itemizedlist>
  39. <listitem>
  40. <para>
  41. <emphasis>types de l'élément</emphasis>&#160;: fourni un type d'élément à
  42. rechercher : "div", "a", "span", "h2", etc.
  43. </para>
  44. </listitem>
  45. <listitem>
  46. <para>
  47. <emphasis>attributs de style</emphasis>&#160;: les classes <acronym>CSS</acronym> à
  48. rechercher&#160;: ".error", "div.error", "label.required", etc. Si un élément
  49. défini plus qu'une classe, la correspondance sera trouvé si la classe est
  50. présente quelque part dans la déclaration de l'attribut.
  51. </para>
  52. </listitem>
  53. <listitem>
  54. <para>
  55. <emphasis>attribut id</emphasis>&#160;: ID de l'élément à rechercher&#160;:
  56. "#content", "div#nav", etc.
  57. </para>
  58. </listitem>
  59. <listitem>
  60. <para>
  61. <emphasis>attributs arbitraires</emphasis>&#160;: tout attribut arbitraire de
  62. l'élément à rechercher. Trois types de recherche sont possibles&#160;:
  63. </para>
  64. <itemizedlist>
  65. <listitem>
  66. <para>
  67. <emphasis>correspondance exacte</emphasis>&#160;: l'attribut vaut
  68. exactement la chaîne fournie : "div[bar="baz"]" trouvera un élément div
  69. qui possède un attribut "bar" dont la valeur vaut exactement
  70. "baz".
  71. </para>
  72. </listitem>
  73. <listitem>
  74. <para>
  75. <emphasis>correspondance de mot</emphasis>&#160;: l'attribut contient
  76. un mot correspondant à la chaîne fournie&#160;: "div[bar~="baz"]"
  77. trouvera un élément div qui possède un attribut "bar" dont la valeur
  78. contient le mot "baz". "&lt;div bar="foo baz"&gt;" trouvera, mais pas
  79. "&lt;div bar="foo bazbat"&gt;".
  80. </para>
  81. </listitem>
  82. <listitem>
  83. <para>
  84. <emphasis>correspondance de parties de chaînes</emphasis>&#160;:
  85. l'attribut contient la chaîne fournie&#160;: "div[bar*="baz"]" trouvera
  86. un élément div qui possède un attribut "bar" dont la valeur contient la
  87. chaîne "baz".
  88. </para>
  89. </listitem>
  90. </itemizedlist>
  91. </listitem>
  92. <listitem>
  93. <para>
  94. <emphasis>Descendants directs</emphasis>&#160;: utilise "&gt;" entre les
  95. sélecteurs pour représenter une descendance direct. "div &gt; span" trouvera
  96. seulement les éléments "span" qui sont des descendants directs d'un élément
  97. "div". Peut aussi être utilisé avec chacun des sélecteurs ci-dessus.
  98. </para>
  99. </listitem>
  100. <listitem>
  101. <para>
  102. <emphasis>Descendants</emphasis>&#160;: une chaîne avec des sélecteurs
  103. multiples ensemble pour indiquer hiérarchie à rechercher. "div .foo span #one"
  104. trouvera un élément avec un id "one" qui est un descendant avec un profondeur
  105. arbitraire d'un élément "span", qui est lui-même un descendant avec un
  106. profondeur arbitraire d'un élément ayant une classe "foo", qui est un
  107. descendant avec un profondeur arbitraire d'un élément "div". Par exemple, il
  108. trouvera le lien vers le mot "One" dans le code ci-dessous&#160;:
  109. </para>
  110. <programlisting language="html"><![CDATA[
  111. <div>
  112. <table>
  113. <tr>
  114. <td class="foo">
  115. <div>
  116. Lorem ipsum <span class="bar">
  117. <a href="/foo/bar" id="one">One</a>
  118. <a href="/foo/baz" id="two">Two</a>
  119. <a href="/foo/bat" id="three">Three</a>
  120. <a href="/foo/bla" id="four">Four</a>
  121. </span>
  122. </div>
  123. </td>
  124. </tr>
  125. </table>
  126. </div>
  127. ]]></programlisting>
  128. </listitem>
  129. </itemizedlist>
  130. <para>
  131. Une fois que vous avez réalisé votre recherche, vous pouvez ensuite travailler
  132. avec l'objet de résultat pour déterminer les informations sur les noeuds, ainsi que
  133. pour les récupérer eux et/ou leurs contenus directement afin de les examiner et les
  134. manipuler. <classname>Zend_Dom_Query_Result</classname> implémente
  135. <code>Countable</code> and <code>Iterator</code>, et stocke le résultat en interne sous
  136. la forme DOMNodes/DOMElements. En exemple, considérons l'appel suivant sur l'HTML
  137. ci-dessus&#160;:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. $dom = new Zend_Dom_Query($html);
  141. $results = $dom->query('.foo .bar a');
  142. $count = count($results); // trouvera 4 correspondances
  143. foreach ($results as $result) {
  144. // $result is a DOMElement
  145. }
  146. ]]></programlisting>
  147. <para>
  148. <classname>Zend_Dom_Query</classname> permet aussi de faire directement des
  149. recherches de type XPath en utilisant la méthode <methodname>queryXpath()</methodname> ; vous
  150. pouvez fournir toute requête XPath valide à cette méthode, et elle retournera un objet
  151. <classname>Zend_Dom_Query_Result</classname>.
  152. </para>
  153. </sect2>
  154. <sect2 id="zend.dom.query.methods">
  155. <title>Méthodes disponibles</title>
  156. <para>
  157. La famille des classes <classname>Zend_Dom_Query</classname> possèdent les
  158. méthodes suivantes.
  159. </para>
  160. <sect3 id="zend.dom.query.methods.zenddomquery">
  161. <title>Zend_Dom_Query</title>
  162. <para>
  163. Ces méthodes sont disponibles pour <classname>Zend_Dom_Query</classname>&#160;:
  164. </para>
  165. <itemizedlist>
  166. <listitem>
  167. <para>
  168. <methodname>setDocumentXml($document)</methodname>&#160;: spécifie une chaîne <acronym>XML</acronym> dans
  169. laquelle requêter.
  170. </para>
  171. </listitem>
  172. <listitem>
  173. <para>
  174. <methodname>setDocumentXhtml($document)</methodname>&#160;: spécifie une chaîne <acronym>XHTML</acronym>
  175. dans laquelle requêter.
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. <methodname>setDocumentHtml($document)</methodname>&#160;: spécifie une chaîne HTML
  181. dans laquelle requêter.
  182. </para>
  183. </listitem>
  184. <listitem>
  185. <para>
  186. <methodname>setDocument($document)</methodname>&#160;: spécifie une chaîne dans
  187. laquelle requêter&#160;; <classname>Zend_Dom_Query</classname> tentera
  188. alors de détecter automatiquement le type de document.
  189. </para>
  190. </listitem>
  191. <listitem>
  192. <para>
  193. <methodname>getDocument()</methodname>&#160;: récupère le document original fourni à
  194. l'objet.
  195. </para>
  196. </listitem>
  197. <listitem>
  198. <para>
  199. <methodname>getDocumentType()</methodname>&#160;: récupère le type de document fourni à
  200. l'objet&#160;; sera une des constantes de classe&#160;:
  201. <constant>DOC_XML</constant>, <constant>DOC_XHTML</constant>, ou <constant>DOC_HTML</constant>.
  202. </para>
  203. </listitem>
  204. <listitem>
  205. <para>
  206. <methodname>query($query)</methodname>&#160;: recherche dans le document en utilisant
  207. la notation de type sélecteur <acronym>CSS</acronym>.
  208. </para>
  209. </listitem>
  210. <listitem>
  211. <para>
  212. <methodname>queryXpath($xPathQuery)</methodname>&#160;: recherche dans le document en
  213. utilisant la notation XPath.
  214. </para>
  215. </listitem>
  216. </itemizedlist>
  217. </sect3>
  218. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  219. <title>Zend_Dom_Query_Result</title>
  220. <para>
  221. Comme mentionné auparavant, <classname>Zend_Dom_Query_Result</classname>
  222. implémente à la fois <code>Iterator</code> et <code>Countable</code>, et en tant
  223. que tel peut être utilisé dans une boucle <code>foreach</code> ainsi qu'avec la
  224. fonction <methodname>count()</methodname>. De plus il expose les méthodes suivantes&#160;:
  225. </para>
  226. <itemizedlist>
  227. <listitem>
  228. <para>
  229. <methodname>getCssQuery()</methodname>&#160;: retourne le sélecteur <acronym>CSS</acronym> utilisé pour
  230. produire le résultat (si fourni).
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. <methodname>getXpathQuery()</methodname>&#160;: retourne la requête XPath utilisé pour
  236. produire le résultat, <classname>Zend_Dom_Query</classname> convertit les
  237. recherches de type sélecteur <acronym>CSS</acronym> en notation XPath, donc cette valeur sera
  238. toujours présente.
  239. </para>
  240. </listitem>
  241. <listitem>
  242. <para>
  243. <methodname>getDocument()</methodname>&#160;: récupère l'élément DOMDocument dans
  244. lequel la recherche à été effectuée.
  245. </para>
  246. </listitem>
  247. </itemizedlist>
  248. </sect3>
  249. </sect2>
  250. </sect1>