Zend_Dom-Query.xml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 21585 -->
  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)<acronym>HTML</acronym> 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 einfacherer 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>
  41. <para>
  42. <emphasis>Element Typen</emphasis>: Bietet einen Elementtypen an, der zu den
  43. folgenden passt: 'div', 'a', 'span', 'h2', usw.
  44. </para>
  45. </listitem>
  46. <listitem>
  47. <para>
  48. <emphasis>Stil Attribute</emphasis>: <acronym>CSS</acronym> Stil Attribute
  49. passen zu folgenden: '<command>.error</command>',
  50. '<command>div.error</command>', '<command>label.required</command>', usw. Wenn
  51. ein Element mehr als einen Stil definiert, wird er entsprechen solange der
  52. benannte Stil irgendwo in der Stil Definition vorhanden ist.
  53. </para>
  54. </listitem>
  55. <listitem>
  56. <para>
  57. <emphasis>Id Attribute</emphasis>: ID Attribute von Elementen passen zu
  58. folgenden: '#content', 'div#nav', usw.
  59. </para>
  60. </listitem>
  61. <listitem>
  62. <para>
  63. <emphasis>Andere Attribute</emphasis>: Andere Attribute von Elementen die
  64. passen. Drei verschiedene Typen die passen werden angeboten:
  65. </para>
  66. <itemizedlist>
  67. <listitem>
  68. <para>
  69. <emphasis>Exakte Entsprechung</emphasis>: Das Attribute passt exakt zum
  70. String: 'div[bar="baz"]' würde zu einem Div Element mit einem "bar"
  71. Attribut passen das exakt den Wert "baz" enthält.
  72. </para>
  73. </listitem>
  74. <listitem>
  75. <para>
  76. <emphasis>Wort Entsprechung</emphasis>: Das Attribut enthält ein Wort
  77. das dem String entspricht: 'div[bar~="baz"]' würde einem Div Element mit
  78. einem "bat" Attribut entsprechen, dass das Wort "baz" enthält.
  79. '&lt;div bar="foo baz"&gt;' würde passen, aber
  80. '&lt;div bar="foo bazbat"&gt;' würde nicht entsprechen.
  81. </para>
  82. </listitem>
  83. <listitem>
  84. <para>
  85. <emphasis>Substring Entsprechung</emphasis>: Das Attribut enthält den
  86. String: 'div[bar*="baz"]' würde einem Div Element mit einem "bar"
  87. Attribut entsprechen, das den String "baz" irgendwo darin enthält.
  88. </para>
  89. </listitem>
  90. </itemizedlist>
  91. </listitem>
  92. <listitem>
  93. <para>
  94. <emphasis>Direkt abhängig</emphasis>: Verwende '&gt;' zwischen Selektoren um
  95. direkte Abhängigkeit auszudrücken. 'div > span' würde nur 'span' Elemente
  96. auswählen, die direkt von 'div' abhängig sind. Kann auch mit jedem Selektor
  97. darüber verwendet werden.
  98. </para>
  99. </listitem>
  100. <listitem>
  101. <para>
  102. <emphasis>Abhängigkeit</emphasis>: Verknüpfung mehrerer Selektoren, um eine
  103. Hierarchie zwischen Ihnen auszudrücken nach welcher gesucht werden soll.
  104. '<command>div .foo span #one</command>' würde ein Element mit der Id 'one'
  105. auswählen, das abhängig ist, in einer beliebigen Tiefe unter einem 'span'
  106. Element, welches seinerseits in einer beliebigen Tiefe darunter von einer Klasse
  107. von 'foo' abhängig ist, welche in einer beliebigen Tiefe von einem 'div' Element
  108. abhängig ist. Der Link zum Wort 'One' im Beispiel anbei würde passen:
  109. </para>
  110. <programlisting language="html"><![CDATA[
  111. <div>
  112. <table>
  113. <tr>
  114. <td class="foo">
  115. <div>
  116. Lorem ipsum <span class="bar">
  117. <a href="/foo/bar" id="one">One</a>
  118. <a href="/foo/baz" id="two">Two</a>
  119. <a href="/foo/bat" id="three">Three</a>
  120. <a href="/foo/bla" id="four">Four</a>
  121. </span>
  122. </div>
  123. </td>
  124. </tr>
  125. </table>
  126. </div>
  127. ]]></programlisting>
  128. </listitem>
  129. </itemizedlist>
  130. <para>
  131. Wenn man eine Abfrage ausgeführt hat, kann man mit dem Ergebnis Objekt arbeiten um
  132. Informationen über die Knoten zu bekommen, sowie um Sie und/oder Ihren Inhalt direkt für
  133. die Extrahierung und Manipulation herauszuholen.
  134. <classname>Zend_Dom_Query_Result</classname> implementiert
  135. <classname>Countable</classname> und <classname>Iterator</classname> und speichert die
  136. Ergebnisse intern als DOMNodes und DOMElements. Als Beispiel nehmen wir erstmal den
  137. folgenden Aufruf an der das obige <acronym>HTML</acronym> auswählt:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. $dom = new Zend_Dom_Query($html);
  141. $results = $dom->query('.foo .bar a');
  142. $count = count($results); // Gib die Anzahl an Gefundenen Nodes zurück: 4
  143. foreach ($results as $result) {
  144. // $result ist ein DOMElement
  145. }
  146. ]]></programlisting>
  147. <para>
  148. <classname>Zend_Dom_Query</classname> erlaubt auch strenge XPath Abfragen durch
  149. Verwendung der <methodname>queryXpath()</methodname> Methode; man kann eine gültige
  150. XPath Abfrage an diese Methode übergeben, und Sie wird ein
  151. <classname>Zend_Dom_Query_Result</classname> Objekt zurückgeben.
  152. </para>
  153. </sect2>
  154. <sect2 id="zend.dom.query.methods">
  155. <title>Vorhandene Methoden</title>
  156. <para>
  157. Die <classname>Zend_Dom_Query</classname> Familie an Klassen enthält die folgenden
  158. Methoden.
  159. </para>
  160. <sect3 id="zend.dom.query.methods.zenddomquery">
  161. <title>Zend_Dom_Query</title>
  162. <para>
  163. Die folgenden Methoden sind in <classname>Zend_Dom_Query</classname> vorhanden:
  164. </para>
  165. <itemizedlist>
  166. <listitem>
  167. <para>
  168. <methodname>setDocumentXml($document)</methodname>: Spezifiziert einen
  169. <acronym>XML</acronym> String der abgefragt werden soll.
  170. </para>
  171. </listitem>
  172. <listitem>
  173. <para>
  174. <methodname>setDocumentXhtml($document)</methodname>: Spezifiziert einen
  175. <acronym>XHTML</acronym> String der abgefragt werden soll.
  176. </para>
  177. </listitem>
  178. <listitem>
  179. <para>
  180. <methodname>setDocumentHtml($document)</methodname>: Spezifiziert einen
  181. <acronym>HTML</acronym> String der abgefragt werden soll.
  182. </para>
  183. </listitem>
  184. <listitem>
  185. <para>
  186. <methodname>setDocument($document)</methodname>: Spezifiziert einen String
  187. der abgefragt werden soll; <classname>Zend_Dom_Query</classname> wird
  188. anschließend versuchen den Typ des Dokument automatisch herauszufinden.
  189. </para>
  190. </listitem>
  191. <listitem>
  192. <para>
  193. <methodname>getDocument()</methodname>: Empfängt den String des Original
  194. Dokuments welches an das Objekt übergeben wurde.
  195. </para>
  196. </listitem>
  197. <listitem>
  198. <para>
  199. <methodname>getDocumentType()</methodname>: Empfängt den Typ des Dokuments
  200. das dem Objekt übergeben wurde; das wird eine der Klassenkonstanten
  201. <constant>DOC_XML</constant>, <constant>DOC_XHTML</constant>, oder
  202. <constant>DOC_HTML</constant> sein.
  203. </para>
  204. </listitem>
  205. <listitem>
  206. <para>
  207. <methodname>query($query)</methodname>: Abfrage des Dokuments bei Verwendung
  208. der <acronym>CSS</acronym> Selektor Schreibweise.
  209. </para>
  210. </listitem>
  211. <listitem>
  212. <para>
  213. <methodname>queryXpath($xPathQuery)</methodname>: Abfrage des Dokuments bei
  214. Verwendung der XPath Schreibweise.
  215. </para>
  216. </listitem>
  217. </itemizedlist>
  218. </sect3>
  219. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  220. <title>Zend_Dom_Query_Result</title>
  221. <para>
  222. Wie vorher erwähnt, implementiert <classname>Zend_Dom_Query_Result</classname>
  223. beide, <classname>Iterator</classname> und <classname>Countable</classname>, und
  224. kann deswegen in einer <methodname>foreach()</methodname> Schleife verwendet werden
  225. wie auch mit der <methodname>count()</methodname> Funktion. Zusätzlich bietet es die
  226. folgenden Methoden an:
  227. </para>
  228. <itemizedlist>
  229. <listitem>
  230. <para>
  231. <methodname>getCssQuery()</methodname>: Gibt die <acronym>CSS</acronym>
  232. Selektor Abfrage zurück, die für die Erstellung des Ergebnisses verwendet
  233. wurde (wenn vorhanden).
  234. </para>
  235. </listitem>
  236. <listitem>
  237. <para>
  238. <methodname>getXpathQuery()</methodname>: Gibt die XPath Abfrage zurück die
  239. für die Erstellung des Ergebnisses verwendet wurde. Intern konvertiert
  240. <classname>Zend_Dom_Query</classname> <acronym>CSS</acronym> Selektor
  241. Abfragen zu XPath, so das dieser Wert immer angeboten wird.
  242. </para>
  243. </listitem>
  244. <listitem>
  245. <para>
  246. <methodname>getDocument()</methodname>: Empfängt das DOMDocument auf das die
  247. Abfrage ausgeführt wurde.
  248. </para>
  249. </listitem>
  250. </itemizedlist>
  251. </sect3>
  252. </sect2>
  253. </sect1>