Zend_Dom-Query.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <sect1 id="zend.dom.query">
  2. <title>Zend_Dom_Query</title>
  3. <para>
  4. <code>Zend_Dom_Query</code> предоставляет механизмы для запросов к
  5. документам XML и (X)HTML с использованием селекторов XPath и CSS.
  6. Он был разработан для того, чтобы помочь с функциональным тестированием
  7. приложений MVC, но может также использоваться для быстрой разработки
  8. кода, извлекающего нужные данные из выводимых данных приложения
  9. (например, XHTML-кода, возвращаемого сайтом).
  10. </para>
  11. <para>
  12. Нотация селекторов CSS предоставляется в качестве более простой и
  13. знакомой веб-разработчикам при произведении запросов к
  14. документам с XML-структурой.
  15. Эта нотация должна быть знакома всем, кто разрабатывает каскадные
  16. таблицы стилей или использует инструменты Javascript,
  17. имеющие функционал для получения узлов через селекторы CSS
  18. (именно функции <ulink url="http://prototypejs.org/api/utility/dollar-dollar">
  19. $$()</ulink> из Prototype и
  20. <ulink url="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">
  21. dojo.query</ulink> из Dojo натолкнули автора на создание этой
  22. компоненты).
  23. </para>
  24. <sect2 id="zend.dom.query.operation">
  25. <title>Теория работы</title>
  26. <para>
  27. Для того, чтобы использовать <code>Zend_Dom_Query</code>,
  28. нужно инстанцировать объект <code>Zend_Dom_Query</code>,
  29. при этом можно передавать содержимое документа, к которому должны
  30. производиться запросы, в виде строки.
  31. Установив документ, вы можете использовать методы
  32. <code>query()</code> и <code>queryXpath()</code>. Эти методы будут
  33. возвращать объект <code>Zend_Dom_Query_Result</code>, который
  34. содержит в себе все найденные узлы.
  35. </para>
  36. <para>
  37. Основное отличие использования <code>Zend_Dom_Query</code> от
  38. применения связки DOMDocument + DOMXPath заключается в возможности
  39. извлечения через селекторы CSS. Вы можете использовать все
  40. перечисленное ниже, в любой комбинации:
  41. </para>
  42. <itemizedlist>
  43. <listitem><para>
  44. <emphasis>селекторы типа</emphasis>: основаны на типе
  45. элемента: 'div', 'a', 'span', 'h2' и т.д.
  46. </para></listitem>
  47. <listitem><para>
  48. <emphasis>селекторы класса</emphasis>: соответствуют атрибуту
  49. class элемента: '.error', 'div.error', 'label.required' и т.д.
  50. Если для элемента указано более одного класса, то этот элемент
  51. будет соотвествовать запросу, если указанный в запросе класс
  52. присутствует в его декларации.
  53. </para></listitem>
  54. <listitem><para>
  55. <emphasis>id-селекторы</emphasis>: соответствуют ID-атрибуту
  56. элемента: '#content', 'div#nav' и т.д.
  57. </para></listitem>
  58. <listitem>
  59. <para>
  60. <emphasis>селекторы атрибута</emphasis>: соответствуют
  61. атрибутам элемента. Используется три типа соответствия:
  62. </para>
  63. <itemizedlist>
  64. <listitem><para>
  65. <emphasis>точное соответствие</emphasis>: значение
  66. атрибута в точности равно данной строке.
  67. Запросу 'div[bar="baz"]' должен соответствовать элемент
  68. div с атрибутом "bar", который имеет значение "baz".
  69. </para></listitem>
  70. <listitem><para>
  71. <emphasis>соответствие слову</emphasis>: атрибут
  72. содержит слово, которое в точности равно данной строке.
  73. Запросу 'div[bar~="baz"]' должен соответствовать элемент
  74. div с атрибутом "bar", который содержит слово "baz".
  75. Элемент '&lt;div bar="foo baz"&gt;' будет
  76. соответствовать этому запросу, но
  77. '&lt;div bar="foo bazbat"&gt;' не будет.
  78. </para></listitem>
  79. <listitem><para>
  80. <emphasis>соответствие подстроке</emphasis>:
  81. атрибут содержит подстроку. Запросу 'div[bar*="baz"]'
  82. должен соответствовать элемент div с атрибутом "bar",
  83. который содержит внутри себя подстроку "baz".
  84. </para></listitem>
  85. </itemizedlist>
  86. </listitem>
  87. <listitem><para>
  88. <emphasis>селекторы прямых потомков</emphasis>: используйте
  89. '&gt;' между селекторами для указания прямых потомков.
  90. 'div > span' должен отбирать только те элементы 'span', которые
  91. являются прямыми потомками 'div'. Эти селекторы можно
  92. использовать с любыми селекторами, перечисленными выше.
  93. </para></listitem>
  94. <listitem>
  95. <para>
  96. <emphasis>селекторы потомков</emphasis>: перечисляйте
  97. селекторы через пробел для обозначения иерархии, вдоль
  98. которой нужно производить поиск. 'div .foo span #one' должен
  99. отбирать элемент с идентификатором 'one', который является
  100. потомком любого уровня элемента 'span', который в свою
  101. очередь является потомком любого уровня элемента класса
  102. 'foo', который является потомком любого уровня элемента
  103. 'div'. Например, такому запросу будет соответствовать
  104. ссылка со словом 'One' в листинге ниже:
  105. </para>
  106. <programlisting language="html"><![CDATA[
  107. <div>
  108. <table>
  109. <tr>
  110. <td class="foo">
  111. <div>
  112. Lorem ipsum <span class="bar">
  113. <a href="/foo/bar" id="one">One</a>
  114. <a href="/foo/baz" id="two">Two</a>
  115. <a href="/foo/bat" id="three">Three</a>
  116. <a href="/foo/bla" id="four">Four</a>
  117. </span>
  118. </div>
  119. </td>
  120. </tr>
  121. </table>
  122. </div>
  123. ]]>
  124. </programlisting>
  125. </listitem>
  126. </itemizedlist>
  127. <para>
  128. Выполнив запрос, вы можете работать с объектами результата для
  129. получения информации об узлах и извлечения самих узлов либо их
  130. содержимого для их исследования или манипуляций с ними.
  131. <code>Zend_Dom_Query_Result</code> реализует интерфейсы
  132. <code>Countable</code>, <code>Iterator</code>, и
  133. сохраняет результат как узлы DOMNode и элементы DOMElement.
  134. Для примера рассмотрим следующий вызов, который производит выборку
  135. из HTML-кода, приведенного выше:
  136. </para>
  137. <programlisting language="php"><![CDATA[
  138. $dom = new Zend_Dom_Query($html);
  139. $results = $dom->query('.foo .bar a');
  140. $count = count($results); // получение числа соответствий: 4
  141. foreach ($results as $result) {
  142. // переменная $result имеет тип DOMElement
  143. }
  144. ]]>
  145. </programlisting>
  146. <para>
  147. <code>Zend_Dom_Query</code> также позволяет применять запросы
  148. XPath через метод <code>queryXpath()</code>. Вы можете передавать
  149. этому методу любые запросы XPath и в случае корректно составленного
  150. запроса он будет возвращать объект
  151. <code>Zend_Dom_Query_Result</code>.
  152. </para>
  153. </sect2>
  154. <sect2 id="zend.dom.query.methods">
  155. <title>Доступные методы</title>
  156. <para>
  157. Семейство классов <code>Zend_Dom_Query</code> имеет следующие
  158. доступные для использования методы.
  159. </para>
  160. <sect3 id="zend.dom.query.methods.zenddomquery">
  161. <title>Zend_Dom_Query</title>
  162. <para>
  163. В классе <code>Zend_Dom_Query</code> доступны следующие методы:
  164. </para>
  165. <itemizedlist>
  166. <listitem><para>
  167. <code>setDocumentXml($document)</code>: принимает строку
  168. с содержимым документа HTML, к которому должны производиться
  169. запросы.
  170. </para></listitem>
  171. <listitem><para>
  172. <code>setDocumentXhtml($document)</code>: принимает строку
  173. с содержимым документа XHTML, к которому должны
  174. производиться запросы.
  175. </para></listitem>
  176. <listitem><para>
  177. <code>setDocumentHtml($document)</code>: принимает строку
  178. с содержимым документа HTML, к которому должны производиться
  179. запросы.
  180. </para></listitem>
  181. <listitem><para>
  182. <code>setDocument($document)</code>: принимает строку без
  183. указания типа документа. В этом случае
  184. <code>Zend_Dom_Query</code> сам попытается определить тип
  185. документа.
  186. </para></listitem>
  187. <listitem><para>
  188. <code>getDocument()</code>: возвращает исходный документ,
  189. переданный объекту.
  190. </para></listitem>
  191. <listitem><para>
  192. <code>getDocumentType()</code>: возвращает тип документа,
  193. переданного объекту. Это должна быть одна из
  194. следующих констант класса Zend_Dom_Query:
  195. <code>DOC_XML</code>, <code>DOC_XHTML</code> или
  196. <code>DOC_HTML</code>.
  197. </para></listitem>
  198. <listitem><para>
  199. <code>query($query)</code>: производит запрос к документу
  200. с использованием нотации селекторов CSS.
  201. </para></listitem>
  202. <listitem><para>
  203. <code>queryXpath($xPathQuery)</code>: производит запрос
  204. к документу с использованием нотации XPath.
  205. </para></listitem>
  206. </itemizedlist>
  207. </sect3>
  208. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  209. <title>Zend_Dom_Query_Result</title>
  210. <para>
  211. Как было упомянуто ранее, <code>Zend_Dom_Query_Result</code>
  212. реализует интерфейсы <code>Iterator</code> и
  213. <code>Countable</code>, поэтому может использоваться в
  214. цикле <code>foreach</code> и с функцией <code>count()</code>.
  215. Кроме того, он предоставляет следующие методы:
  216. </para>
  217. <itemizedlist>
  218. <listitem><para>
  219. <code>getCssQuery()</code>: возвращает запрос-селектор CSS,
  220. который использовался для получения результата (если был).
  221. </para></listitem>
  222. <listitem><para>
  223. <code>getXpathQuery()</code>: возвращает запрос XPath,
  224. который использовался для получения результата.
  225. <code>Zend_Dom_Query</code> неявным образом преобразует
  226. запросы с селекторами CSS в запросы XPath, поэтому это
  227. значение всегда будет заполняться.
  228. </para></listitem>
  229. <listitem><para>
  230. <code>getDocument()</code>: возвращает объект DOMDocument,
  231. к которому производился запрос.
  232. </para></listitem>
  233. </itemizedlist>
  234. </sect3>
  235. </sect2>
  236. </sect1>
  237. <!--
  238. vim:se ts=4 sw=4 et:
  239. -->