Zend_Dom-Query.xml 11 KB

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