Zend_Dom-Query.xml 12 KB

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