| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- <?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>
|