Zend_Dom-Query.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15156 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.dom.query">
  5. <title>Zend_Dom_Query</title>
  6. <para>
  7. <classname>Zend_Dom_Query</classname> bietet einen Mechanismus für die Abfrage von XML und (X)HTML Dokumenten
  8. indem entweder XPath oder CSS Selektoren verwendet werden. Sie wurde entwickelt um bei funktionalem
  9. Testen von MVC Anwendungen zu helfen, könnte aber auch für schnelle Entwicklung von Screen Scraper
  10. verwendet werden.
  11. </para>
  12. <para>
  13. Die CSS Selektor Schreibweise wird als einfachere und für Web Entwickler bekannterer Weg angeboten um
  14. bei der Anfrage von Dokumenten mit XML Strukturen zu helfen. Diese Schreibweise sollte jedem der
  15. Cascading Style Sheets entwickelt hat bekannt sein, oder jedem der Javascript Toolkits verwendet die
  16. Funktionalität für das Auswählen von Knoten bei der Anpassung von SCC Selektoren anbieten
  17. (<ulink url="http://prototypejs.org/api/utility/dollar-dollar">Prototype's
  18. $$()</ulink> und
  19. <ulink url="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">Dojo's
  20. dojo.query</ulink> sind beides Inspirationen für diese Komponente).
  21. </para>
  22. <sect2 id="zend.dom.query.operation">
  23. <title>Theorie der Anwendung</title>
  24. <para>
  25. Um <classname>Zend_Dom_Query</classname> zu verwenden muß ein <classname>Zend_Dom_Query</classname> Objekt instanziert
  26. werden, optional kann ein zu parsendes Dokument (ein String) übergeben werden. Sobald man ein
  27. Dokument hat, kann die <code>query()</code> oder die <code>queryXpath()</code> Methode verwendet
  28. werden; jede Methode gibt ein <classname>Zend_Dom_Query_Result</classname> Objekt mit allen passenden
  29. Knoten zurück.
  30. </para>
  31. <para>
  32. Der Grundsätzliche Unterschied zwischen <classname>Zend_Dom_Query</classname> und der Verwendung von
  33. DOMDocument + DOMXPath ist die Möglichkeit CSS Selektoren auszuwählen. Alle folgenden Elemente
  34. können in jeder Kombination verwendet werden:
  35. </para>
  36. <itemizedlist>
  37. <listitem><para>
  38. <emphasis>Element Typen</emphasis>: Bietet einen Elementtypen an der zu den folgenden passt:
  39. 'div', 'a', 'span', 'h2', usw.
  40. </para></listitem>
  41. <listitem><para>
  42. <emphasis>Stil Attribute</emphasis>: CSS Stil Attribute passen zu folgenden:
  43. '.error', 'div.error', 'label.required', usw. Wenn ein Element mehr als einen Stil definiert
  44. wird er entsprechen solange der benannte Stil irgendwo in der Stil Definition vorhanden ist.
  45. </para></listitem>
  46. <listitem><para>
  47. <emphasis>Id Attribute</emphasis>: ID Attribute von Elementen passen zu folgenden:
  48. '#content', 'div#nav', usw.
  49. </para></listitem>
  50. <listitem>
  51. <para>
  52. <emphasis>Andere Attribute</emphasis>: Andere Attribute von Elementen die passen. Drei
  53. verschiedene Typen die passen werden angeboten:
  54. </para>
  55. <itemizedlist>
  56. <listitem><para>
  57. <emphasis>Exakte Entsprechung</emphasis>: Das Attribute passt exakt zum String:
  58. 'div[bar="baz"]' würde zu einem Div Element mit einem "bar" Attribut passen das
  59. exakt den Wert "baz" enthält.
  60. </para></listitem>
  61. <listitem><para>
  62. <emphasis>Wort Entsprechung</emphasis>: Das Attribut enthält ein Wort das dem String
  63. entspricht: 'div[bar~="baz"]' würde einem Div Element mit einem "bat" Attribut
  64. entsprechen das das Wort "baz" enthält. '&lt;div bar="foo baz"&gt;' würde passen
  65. aber '&lt;div bar="foo bazbat"&gt;' würde nicht entsprechen.
  66. </para></listitem>
  67. <listitem><para>
  68. <emphasis>Substring Entsprechung</emphasis>: Das Atribut enthält den String:
  69. 'div[bar*="baz"]' würde einem Div Element mit einem "bar" Attribut entsprechen das den
  70. String "baz" irgendwo in Ihm enthält.
  71. </para></listitem>
  72. </itemizedlist>
  73. </listitem>
  74. <listitem><para>
  75. <emphasis>Direkt abhängig</emphasis>: Verwende '&gt;' zwischen Selektoren um direkte
  76. Abhängigkeit auszudrücken. 'div > span' würde nur 'span' Elemente auswählen die direkt
  77. Abhängig von 'div' sind. Kann auch mit jedem Selektor darüber verwendet werden.
  78. </para></listitem>
  79. <listitem>
  80. <para>
  81. <emphasis>Abhängigkeit</emphasis>: Mehrere Selektoren zusammenschreiben um eine
  82. Hirarchie zwischen Ihnen auszudrücken nach welcher gesucht werden soll.
  83. 'div .foo span #one' würde ein Element mit der Id 'one' auswählen das Abhängig ist
  84. in einer beliebigen Tiefe unter einem 'span' Element, welches seinerseits in einer
  85. beliebigen Tiefe darunter abhängig ist von einer Klase von 'foo', welche in einer
  86. beliebigen Tiefe abhängig ist von einem 'div' Element. Der Link zum Wort 'One' im
  87. Beispiel anbei würde passen:
  88. </para>
  89. <programlisting role="html"><![CDATA[
  90. <div>
  91. <table>
  92. <tr>
  93. <td class="foo">
  94. <div>
  95. Lorem ipsum <span class="bar">
  96. <a href="/foo/bar" id="one">One</a>
  97. <a href="/foo/baz" id="two">Two</a>
  98. <a href="/foo/bat" id="three">Three</a>
  99. <a href="/foo/bla" id="four">Four</a>
  100. </span>
  101. </div>
  102. </td>
  103. </tr>
  104. </table>
  105. </div>
  106. ]]>
  107. </programlisting>
  108. </listitem>
  109. </itemizedlist>
  110. <para>
  111. Wenn man eine Abfrage ausgeführt hat, kann man mit dem Ergebnis Objekt arbeiten um Informationen
  112. über die Knoten zu bekommen, sowie um Sie und/oder Ihren Inhalt direkt für die Extrahierung und
  113. Manipulation herauszuholen. <classname>Zend_Dom_Query_Result</classname> implementiert <code>Countable</code>
  114. und <code>Iterator</code> und speichert die Ergebnisse intern als DOMNodes/DOMElements. Als Beispiel
  115. nehmen wir erstmal den folgenden Aufruf an der das obige HTML auswählt:
  116. </para>
  117. <programlisting role="php"><![CDATA[
  118. $dom = new Zend_Dom_Query($html);
  119. $results = $dom->query('.foo .bar a');
  120. $count = count($results); // Gib die Anzahl an Gefundenen Nodes zurück: 4
  121. foreach ($results as $result) {
  122. // $result ist ein DOMElement
  123. }
  124. ]]></programlisting>
  125. <para>
  126. <classname>Zend_Dom_Query</classname> erlaubt auch strenge XPath Abfragen durch Verwendung der
  127. <code>queryXpath()</code> Methode; man kann eine gültige XPath Abfrage an diese Methode übergeben,
  128. und Sie wird ein <classname>Zend_Dom_Query_Result</classname> Objekt zurückgeben.
  129. </para>
  130. </sect2>
  131. <sect2 id="zend.dom.query.methods">
  132. <title>Vorhandene Methoden</title>
  133. <para>
  134. Die <classname>Zend_Dom_Query</classname> Familie an Klassen enthält die folgenden Methoden.
  135. </para>
  136. <sect3 id="zend.dom.query.methods.zenddomquery">
  137. <title>Zend_Dom_Query</title>
  138. <para>
  139. Die folgenden Methoden sind in <classname>Zend_Dom_Query</classname> vorhanden:
  140. </para>
  141. <itemizedlist>
  142. <listitem><para>
  143. <code>setDocumentXml($document)</code>: Spezifiziert einen XML String der Abgefragt
  144. werden soll.
  145. </para></listitem>
  146. <listitem><para>
  147. <code>setDocumentXhtml($document)</code>: Spezifiziert einen XHTML String der Abgefragt
  148. werden soll.
  149. </para></listitem>
  150. <listitem><para>
  151. <code>setDocumentHtml($document)</code>: Spezifiziert einen HTML String der Abgefragt
  152. werden soll.
  153. </para></listitem>
  154. <listitem><para>
  155. <code>setDocument($document)</code>: Spezifiziert einen String der abgefragt werden soll;
  156. <classname>Zend_Dom_Query</classname> wird anschließend versuchen den Typ des Dokument automatisch
  157. herauszufinden.
  158. </para></listitem>
  159. <listitem><para>
  160. <code>getDocument()</code>: Empfängt den String des Original Dokuments das an das Objekt
  161. übergeben wurde.
  162. </para></listitem>
  163. <listitem><para>
  164. <code>getDocumentType()</code>: Empfängt den Typ des Dokuments das dem Objekt übergeben
  165. wurde; das wird eine der Klassenkonstanten <code>DOC_XML</code>, <code>DOC_XHTML</code>,
  166. oder <code>DOC_HTML</code> sein.
  167. </para></listitem>
  168. <listitem><para>
  169. <code>query($query)</code>: Abfrage des Dokuments bei Verwendung der CSS Selektor
  170. Schreibweise.
  171. </para></listitem>
  172. <listitem><para>
  173. <code>queryXpath($xPathQuery)</code>: Abfrage des Dokuments bei Verwendung der XPath
  174. Schreibweise.
  175. </para></listitem>
  176. </itemizedlist>
  177. </sect3>
  178. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  179. <title>Zend_Dom_Query_Result</title>
  180. <para>
  181. Wie vorher erwähnt, implementiert <classname>Zend_Dom_Query_Result</classname> beide, <code>Iterator</code>
  182. und <code>Countable</code>, und kann deswegen in einer <code>foreach</code> Schleife
  183. verwendet werden wie auch mit der <code>count()</code> Funktion. Zusätzlich bietet es die
  184. folgenden Methoden an:
  185. </para>
  186. <itemizedlist>
  187. <listitem><para>
  188. <code>getCssQuery()</code>: Gibt die CSS Selektor Abfrage zurück die für die Erstellung
  189. des Ergebnisses verwendet wurde (wenn vorhanden).
  190. </para></listitem>
  191. <listitem><para>
  192. <code>getXpathQuery()</code>: Gibt die XPath Abfrage zurück die für die Erstellung des
  193. Ergebnisses verwendet wurde. Intern konvertiert <classname>Zend_Dom_Query</classname> CSS
  194. Selektor Abfragen zu XPath, so das dieser Wert immer angeboten wird.
  195. </para></listitem>
  196. <listitem><para>
  197. <code>getDocument()</code>: Empfängt das DOMDocument auf das die Abfrage ausgeführt wurde.
  198. </para></listitem>
  199. </itemizedlist>
  200. </sect3>
  201. </sect2>
  202. </sect1>
  203. <!--
  204. vim:se ts=4 sw=4 et:
  205. -->