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 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
|
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.dom.query">
<title>Zend_Dom_Query</title>
<para>
<classname>Zend_Dom_Query</classname> fournit des mécanismes pour requêter dans les
documents <acronym>XML</acronym> et (X)HTML en utilisant soit XPath ou les sélecteurs <acronym>CSS</acronym>. Il a été développé
pour faciliter les tests fonctionnels des applications <acronym>MVC</acronym>, mais pourrait également être
employé pour le développement rapide de "screen scrapers".
</para>
<para>
La notation de type sélecteur <acronym>CSS</acronym> est fournie comme notation plus simple et plus
familière pour les développeurs Web à utiliser lors de la requête de documents ayant une
structure de type <acronym>XML</acronym>. La notation devrait être familière pour n'importe qui ayant écrit
des feuilles de styles <acronym>CSS</acronym> ou ayant utiliser des librairies Javascript qui fournissent pour
sélectionner des noeuds en utilisant des sélecteurs <acronym>CSS</acronym> (
<ulink url="http://prototypejs.org/api/utility/dollar-dollar">Prototype's $$()</ulink>et
<ulink url="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">Dojo's
dojo.query</ulink>ont tous les deux inspirer ce composant).
</para>
<sect2 id="zend.dom.query.operation">
<title>Aspect théorique</title>
<para>
Pour utiliser <classname>Zend_Dom_Query</classname>, vous instanciez un objet
<classname>Zend_Dom_Query</classname>, en fournissant optionnellement un document à
analyser (sous la forme d'une chaîne). Une fois que vous avez un document, vous pouvez
utiliser indifféremment les méthodes <methodname>query()</methodname> ou
<methodname>queryXpath()</methodname> ; chaque méthode retournera un objet
<classname>Zend_Dom_Query_Result</classname> avec tout noeud trouvé.
</para>
<para>
La différence principale entre <classname>Zend_Dom_Query</classname> et
l'utilisation de DOMDocument + DOMXPath est la possibilité de requêter avec les
sélecteurs <acronym>CSS</acronym>. Vous pouvez utiliser n'importe quel élément suivant, dans n'importe
quelle combinaison :
</para>
<itemizedlist>
<listitem>
<para>
<emphasis>types de l'élément</emphasis> : fourni un type d'élément à
rechercher : "div", "a", "span", "h2", etc.
</para>
</listitem>
<listitem>
<para>
<emphasis>attributs de style</emphasis> : les classes <acronym>CSS</acronym> à
rechercher : ".error", "div.error", "label.required", etc. Si un élément
défini plus qu'une classe, la correspondance sera trouvé si la classe est
présente quelque part dans la déclaration de l'attribut.
</para>
</listitem>
<listitem>
<para>
<emphasis>attribut id</emphasis> : ID de l'élément à rechercher :
"#content", "div#nav", etc.
</para>
</listitem>
<listitem>
<para>
<emphasis>attributs arbitraires</emphasis> : tout attribut arbitraire de
l'élément à rechercher. Trois types de recherche sont possibles :
</para>
<itemizedlist>
<listitem>
<para>
<emphasis>correspondance exacte</emphasis> : l'attribut vaut
exactement la chaîne fournie : "div[bar="baz"]" trouvera un élément div
qui possède un attribut "bar" dont la valeur vaut exactement
"baz".
</para>
</listitem>
<listitem>
<para>
<emphasis>correspondance de mot</emphasis> : l'attribut contient
un mot correspondant à la chaîne fournie : "div[bar~="baz"]"
trouvera un élément div qui possède un attribut "bar" dont la valeur
contient le mot "baz". "<div bar="foo baz">" trouvera, mais pas
"<div bar="foo bazbat">".
</para>
</listitem>
<listitem>
<para>
<emphasis>correspondance de parties de chaînes</emphasis> :
l'attribut contient la chaîne fournie : "div[bar*="baz"]" trouvera
un élément div qui possède un attribut "bar" dont la valeur contient la
chaîne "baz".
</para>
</listitem>
</itemizedlist>
</listitem>
<listitem>
<para>
<emphasis>Descendants directs</emphasis> : utilise ">" entre les
sélecteurs pour représenter une descendance direct. "div > span" trouvera
seulement les éléments "span" qui sont des descendants directs d'un élément
"div". Peut aussi être utilisé avec chacun des sélecteurs ci-dessus.
</para>
</listitem>
<listitem>
<para>
<emphasis>Descendants</emphasis> : une chaîne avec des sélecteurs
multiples ensemble pour indiquer hiérarchie à rechercher. "div .foo span #one"
trouvera un élément avec un id "one" qui est un descendant avec un profondeur
arbitraire d'un élément "span", qui est lui-même un descendant avec un
profondeur arbitraire d'un élément ayant une classe "foo", qui est un
descendant avec un profondeur arbitraire d'un élément "div". Par exemple, il
trouvera le lien vers le mot "One" dans le code ci-dessous :
</para>
<programlisting language="html"><![CDATA[
<div>
<table>
<tr>
<td class="foo">
<div>
Lorem ipsum <span class="bar">
<a href="/foo/bar" id="one">One</a>
<a href="/foo/baz" id="two">Two</a>
<a href="/foo/bat" id="three">Three</a>
<a href="/foo/bla" id="four">Four</a>
</span>
</div>
</td>
</tr>
</table>
</div>
]]></programlisting>
</listitem>
</itemizedlist>
<para>
Une fois que vous avez réalisé votre recherche, vous pouvez ensuite travailler
avec l'objet de résultat pour déterminer les informations sur les noeuds, ainsi que
pour les récupérer eux et/ou leurs contenus directement afin de les examiner et les
manipuler. <classname>Zend_Dom_Query_Result</classname> implémente
<code>Countable</code> and <code>Iterator</code>, et stocke le résultat en interne sous
la forme DOMNodes/DOMElements. En exemple, considérons l'appel suivant sur l'HTML
ci-dessus :
</para>
<programlisting language="php"><![CDATA[
$dom = new Zend_Dom_Query($html);
$results = $dom->query('.foo .bar a');
$count = count($results); // trouvera 4 correspondances
foreach ($results as $result) {
// $result is a DOMElement
}
]]></programlisting>
<para>
<classname>Zend_Dom_Query</classname> permet aussi de faire directement des
recherches de type XPath en utilisant la méthode <methodname>queryXpath()</methodname> ; vous
pouvez fournir toute requête XPath valide à cette méthode, et elle retournera un objet
<classname>Zend_Dom_Query_Result</classname>.
</para>
</sect2>
<sect2 id="zend.dom.query.methods">
<title>Méthodes disponibles</title>
<para>
La famille des classes <classname>Zend_Dom_Query</classname> possèdent les
méthodes suivantes.
</para>
<sect3 id="zend.dom.query.methods.zenddomquery">
<title>Zend_Dom_Query</title>
<para>
Ces méthodes sont disponibles pour <classname>Zend_Dom_Query</classname> :
</para>
<itemizedlist>
<listitem>
<para>
<methodname>setDocumentXml($document)</methodname> : spécifie une chaîne <acronym>XML</acronym> dans
laquelle requêter.
</para>
</listitem>
<listitem>
<para>
<methodname>setDocumentXhtml($document)</methodname> : spécifie une chaîne <acronym>XHTML</acronym>
dans laquelle requêter.
</para>
</listitem>
<listitem>
<para>
<methodname>setDocumentHtml($document)</methodname> : spécifie une chaîne HTML
dans laquelle requêter.
</para>
</listitem>
<listitem>
<para>
<methodname>setDocument($document)</methodname> : spécifie une chaîne dans
laquelle requêter ; <classname>Zend_Dom_Query</classname> tentera
alors de détecter automatiquement le type de document.
</para>
</listitem>
<listitem>
<para>
<methodname>getDocument()</methodname> : récupère le document original fourni à
l'objet.
</para>
</listitem>
<listitem>
<para>
<methodname>getDocumentType()</methodname> : récupère le type de document fourni à
l'objet ; sera une des constantes de classe :
<constant>DOC_XML</constant>, <constant>DOC_XHTML</constant>, ou <constant>DOC_HTML</constant>.
</para>
</listitem>
<listitem>
<para>
<methodname>query($query)</methodname> : recherche dans le document en utilisant
la notation de type sélecteur <acronym>CSS</acronym>.
</para>
</listitem>
<listitem>
<para>
<methodname>queryXpath($xPathQuery)</methodname> : recherche dans le document en
utilisant la notation XPath.
</para>
</listitem>
</itemizedlist>
</sect3>
<sect3 id="zend.dom.query.methods.zenddomqueryresult">
<title>Zend_Dom_Query_Result</title>
<para>
Comme mentionné auparavant, <classname>Zend_Dom_Query_Result</classname>
implémente à la fois <code>Iterator</code> et <code>Countable</code>, et en tant
que tel peut être utilisé dans une boucle <code>foreach</code> ainsi qu'avec la
fonction <methodname>count()</methodname>. De plus il expose les méthodes suivantes :
</para>
<itemizedlist>
<listitem>
<para>
<methodname>getCssQuery()</methodname> : retourne le sélecteur <acronym>CSS</acronym> utilisé pour
produire le résultat (si fourni).
</para>
</listitem>
<listitem>
<para>
<methodname>getXpathQuery()</methodname> : retourne la requête XPath utilisé pour
produire le résultat, <classname>Zend_Dom_Query</classname> convertit les
recherches de type sélecteur <acronym>CSS</acronym> en notation XPath, donc cette valeur sera
toujours présente.
</para>
</listitem>
<listitem>
<para>
<methodname>getDocument()</methodname> : récupère l'élément DOMDocument dans
lequel la recherche à été effectuée.
</para>
</listitem>
</itemizedlist>
</sect3>
</sect2>
</sect1>
|