Zend_Dom-Query.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17173 -->
  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. <methodname>query()</methodname> oder die <methodname>queryXpath()</methodname> Methode
  29. verwendet werden; jede Methode gibt ein <classname>Zend_Dom_Query_Result</classname>
  30. Objekt mit allen passenden 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 language="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 language="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 <methodname>queryXpath()</methodname> Methode; man kann eine gültige
  132. XPath Abfrage an diese Methode übergeben, und Sie wird ein
  133. <classname>Zend_Dom_Query_Result</classname> 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. <methodname>setDocumentXml($document)</methodname>: Spezifiziert einen XML
  150. String der Abgefragt werden soll.
  151. </para></listitem>
  152. <listitem><para>
  153. <methodname>setDocumentXhtml($document)</methodname>: Spezifiziert einen XHTML
  154. String der Abgefragt werden soll.
  155. </para></listitem>
  156. <listitem><para>
  157. <methodname>setDocumentHtml($document)</methodname>: Spezifiziert einen HTML
  158. String der Abgefragt werden soll.
  159. </para></listitem>
  160. <listitem><para>
  161. <methodname>setDocument($document)</methodname>: Spezifiziert einen String der
  162. abgefragt werden soll; <classname>Zend_Dom_Query</classname> wird anschließend
  163. versuchen den Typ des Dokument automatisch herauszufinden.
  164. </para></listitem>
  165. <listitem><para>
  166. <methodname>getDocument()</methodname>: Empfängt den String des Original
  167. Dokuments das an das Objekt übergeben wurde.
  168. </para></listitem>
  169. <listitem><para>
  170. <methodname>getDocumentType()</methodname>: Empfängt den Typ des Dokuments das
  171. dem Objekt übergeben wurde; das wird eine der Klassenkonstanten
  172. <constant>DOC_XML</constant>, <constant>DOC_XHTML</constant>, oder
  173. <constant>DOC_HTML</constant> sein.
  174. </para></listitem>
  175. <listitem><para>
  176. <methodname>query($query)</methodname>: Abfrage des Dokuments bei Verwendung
  177. der CSS Selektor Schreibweise.
  178. </para></listitem>
  179. <listitem><para>
  180. <methodname>queryXpath($xPathQuery)</methodname>: Abfrage des Dokuments bei
  181. Verwendung der XPath Schreibweise.
  182. </para></listitem>
  183. </itemizedlist>
  184. </sect3>
  185. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  186. <title>Zend_Dom_Query_Result</title>
  187. <para>
  188. Wie vorher erwähnt, implementiert <classname>Zend_Dom_Query_Result</classname>
  189. beide, <code>Iterator</code> und <code>Countable</code>, und kann deswegen in einer
  190. <code>foreach</code> Schleife verwendet werden wie auch mit der
  191. <methodname>count()</methodname> Funktion. Zusätzlich bietet es die folgenden
  192. Methoden an:
  193. </para>
  194. <itemizedlist>
  195. <listitem><para>
  196. <methodname>getCssQuery()</methodname>: Gibt die CSS Selektor Abfrage zurück
  197. die für die Erstellung des Ergebnisses verwendet wurde (wenn vorhanden).
  198. </para></listitem>
  199. <listitem><para>
  200. <methodname>getXpathQuery()</methodname>: Gibt die XPath Abfrage zurück die für
  201. die Erstellung des Ergebnisses verwendet wurde. Intern konvertiert
  202. <classname>Zend_Dom_Query</classname> CSS Selektor Abfragen zu XPath, so das
  203. dieser Wert immer angeboten wird.
  204. </para></listitem>
  205. <listitem><para>
  206. <methodname>getDocument()</methodname>: Empfängt das DOMDocument auf das die
  207. Abfrage ausgeführt wurde.
  208. </para></listitem>
  209. </itemizedlist>
  210. </sect3>
  211. </sect2>
  212. </sect1>
  213. <!--
  214. vim:se ts=4 sw=4 et:
  215. -->