Zend_Dom-Query.xml 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <sect1 id="zend.dom.query">
  2. <title>Zend_Dom_Query</title>
  3. <para>
  4. <code>Zend_Dom_Query</code> 为利用 XPath 或 CSS 选择器来查询 XML 和
  5. (X)HTML 文档提供了机制。
  6. 它为帮助 MVC 应用的功能测试而开发,但也用于 screen scrapers 的快速开发。
  7. </para>
  8. <para>
  9. 当用 XML 结构查询文档时,对于 web 开发者来说,CSS 选择器符号简单而熟悉。
  10. 对开发过 Cascading Style Sheets 或用过提供使用 CSS 选择器
  11. (<ulink url="http://prototypejs.org/api/utility/dollar-dollar">Prototype's
  12. $$()</ulink> 和
  13. <ulink url="http://api.dojotoolkit.org/jsdoc/dojo/HEAD/dojo.query">Dojo's
  14. dojo.query</ulink> 都是组件的灵魂)选择节点的功能的 Javascript 工具箱的开发者来说,符号应当很熟悉。
  15. </para>
  16. <sect2 id="zend.dom.query.operation">
  17. <title> 操作理论 </title>
  18. <para>
  19. 要使用 <code>Zend_Dom_Query</code>,你需要初始化一个
  20. <code>Zend_Dom_Query</code> 对象,并可选地传递一个文档到查询(一字符串)。
  21. 一旦你有一个文档,可以使用 <code>query()</code> 或 <code>queryXpath()</code> 方法;
  22. 每个方法将返回带有任何匹配节点的 <code>Zend_Dom_Query_Result</code> 对象。
  23. </para>
  24. <para>
  25. <code>Zend_Dom_Query</code> 和使用 DOMDocument + DOMXPath 的主要不同之处是可以依靠 CSS 选择器来选择。
  26. 你可以使用下列的任何组合:
  27. </para>
  28. <itemizedlist>
  29. <listitem><para>
  30. <emphasis>element types</emphasis>: 提供一个元素类型来匹配:
  31. 'div'、 'a'、 'span'、 'h2' 等。
  32. </para></listitem>
  33. <listitem><para>
  34. <emphasis>style attributes</emphasis>:
  35. 匹配 '.error'、 'div.error'、 'label.required' 等的 CSS 风格属性。
  36. 如果任何元素定义了超过一个风格,只要命名的风格出现在风格声明的任何地方,它将匹配。
  37. </para></listitem>
  38. <listitem><para>
  39. <emphasis>id attributes</emphasis>:
  40. 匹配 '#content'、 'div#nav' 等的元素 ID 属性。
  41. </para></listitem>
  42. <listitem>
  43. <para>
  44. <emphasis>arbitrary attributes</emphasis>: 用于匹配的属性元素的属性。
  45. 有三个不同的匹配类型:
  46. </para>
  47. <itemizedlist>
  48. <listitem><para>
  49. <emphasis>exact match</emphasis>: 属性和字符串精确地匹配:
  50. 'div[bar="baz"]' 表示带有 "bar" 属性的 div 元素精确地匹配值 "baz"。
  51. </para></listitem>
  52. <listitem><para>
  53. <emphasis>word match</emphasis>: 包含匹配字符串 'div[bar~="baz"]' 的字符的
  54. 属性将匹配一个带有包含 "baz"字符的 "bar"属性的 div 元素。
  55. '&lt;div bar="foo baz"&gt;' 匹配,而'&lt;div bar="foo bazbat"&gt;'不匹配。
  56. </para></listitem>
  57. <listitem><para>
  58. <emphasis>substring match</emphasis>:
  59. 包含 'div[bar*="baz"]' 字符串的属性将匹配一个带有在它内部
  60. 任何地方包含字符串 "baz" 的 "bar" 属性的 div 元素。
  61. </para></listitem>
  62. </itemizedlist>
  63. </listitem>
  64. <listitem><para>
  65. <emphasis>direct descendents</emphasis>:
  66. 利用在选择器之间的 '&gt;'表示直接的子孙。'div > span'将只选择 'div'直接的子孙 'span' 元素。
  67. 它可用于任何上述的选择器。
  68. </para></listitem>
  69. <listitem>
  70. <para>
  71. <emphasis>descendents</emphasis>:
  72. 把多个选择器集中成一字符串来表示一个搜索的层次。
  73. 'div .foo span #one' 选择一个 id 'one' 的元素,它是在 'span' 元素下任意深度的子孙,
  74. 它也是 'foo' 类下面任意深度的子孙,而 'foo' 元素是 'div' 元素下任意深度的子孙。
  75. 例如,在下面列表中,它将匹配带有 'One' 字符的链接:
  76. </para>
  77. <programlisting role="html"><![CDATA[
  78. <div>
  79. <table>
  80. <tr>
  81. <td class="foo">
  82. <div>
  83. Lorem ipsum <span class="bar">
  84. <a href="/foo/bar" id="one">One</a>
  85. <a href="/foo/baz" id="two">Two</a>
  86. <a href="/foo/bat" id="three">Three</a>
  87. <a href="/foo/bla" id="four">Four</a>
  88. </span>
  89. </div>
  90. </td>
  91. </tr>
  92. </table>
  93. </div>
  94. ]]>
  95. </programlisting>
  96. </listitem>
  97. </itemizedlist>
  98. <para>
  99. 一旦你执行了查询,你可以使用结果对象来确定节点的信息,同时,你也可以
  100. 把它们和/或它们的内容拿出来检查和处理。
  101. <code>Zend_Dom_Query_Result</code> 实现 <code>Countable</code>
  102. 和 <code>Iterator</code> 并在内部存储结果为
  103. DOMNodes/DOMElements。
  104. 作为例子,考虑下列的调用,它依靠上述的 HTML 来选择:
  105. </para>
  106. <programlisting role="php"><![CDATA[
  107. $dom = new Zend_Dom_Query($html);
  108. $results = $dom->query('.foo .bar a');
  109. $count = count($results); // get number of matches: 4
  110. foreach ($results as $result) {
  111. // $result is a DOMElement
  112. }
  113. ]]>
  114. </programlisting>
  115. <para>
  116. <code>Zend_Dom_Query</code> 也允许利用 <code>queryXpath()</code> method 直接 XPath 查询;
  117. 你可以传递任何有效的 XPath 查询给这个方法,它将返回一个
  118. <code>Zend_Dom_Query_Result</code> 对象。
  119. </para>
  120. </sect2>
  121. <sect2 id="zend.dom.query.methods">
  122. <title> 可用方法 </title>
  123. <para>
  124. <code>Zend_Dom_Query</code> 类家族有下列方法可用。
  125. </para>
  126. <sect3 id="zend.dom.query.methods.zenddomquery">
  127. <title>Zend_Dom_Query</title>
  128. <para>
  129. 下列方法对 <code>Zend_Dom_Query</code> 可用:
  130. </para>
  131. <itemizedlist>
  132. <listitem><para>
  133. <code>setDocumentXml($document)</code>: 指定一个查询使用的 XML 字符串。
  134. </para></listitem>
  135. <listitem><para>
  136. <code>setDocumentXhtml($document)</code>: 指定一个查询使用的 XHTML 字符串。
  137. </para></listitem>
  138. <listitem><para>
  139. <code>setDocumentHtml($document)</code>: 指定一个查询使用的 HTML 字符串。
  140. </para></listitem>
  141. <listitem><para>
  142. <code>setDocument($document)</code>: 指定一个查询使用的字符串;
  143. <code>Zend_Dom_Query</code> 将尝试自动检查文档类型。
  144. </para></listitem>
  145. <listitem><para>
  146. <code>getDocument()</code>: 获取提供给对象的原始文档字符串。
  147. </para></listitem>
  148. <listitem><para>
  149. <code>getDocumentType()</code>: 获取提供给对象的文档的类型;是
  150. <code>DOC_XML</code>、 <code>DOC_XHTML</code> 或
  151. <code>DOC_HTML</code> 类常量其中之一。
  152. </para></listitem>
  153. <listitem><para>
  154. <code>query($query)</code>: 使用 CSS 选择器符号查询文档。
  155. </para></listitem>
  156. <listitem><para>
  157. <code>queryXpath($xPathQuery)</code>: 使用 XPath 符号查询文档。
  158. </para></listitem>
  159. </itemizedlist>
  160. </sect3>
  161. <sect3 id="zend.dom.query.methods.zenddomqueryresult">
  162. <title>Zend_Dom_Query_Result</title>
  163. <para>
  164. 如前所述,<code>Zend_Dom_Query_Result</code>
  165. 实现 <code>Iterator</code> 和 <code>Countable</code>,
  166. 可用于 <code>foreach</code> 循环和 <code>count()</code> 函数。
  167. 另外,它有下列方法:
  168. </para>
  169. <itemizedlist>
  170. <listitem><para>
  171. <code>getCssQuery()</code>: 返回用于处理结果(如果有的话)的 CSS 选择器查询。
  172. </para></listitem>
  173. <listitem><para>
  174. <code>getXpathQuery()</code>: 返回用于处理结果的 XPath 查询。
  175. 在内部,<code>Zend_Dom_Query</code> 转换 CSS 选择器查选为 XPath,所以这个值将永远被组装。
  176. </para></listitem>
  177. <listitem><para>
  178. <code>getDocument()</code>: 获取选择使用的文档。
  179. </para></listitem>
  180. </itemizedlist>
  181. </sect3>
  182. </sect2>
  183. </sect1>
  184. <!--
  185. vim:se ts=4 sw=4 et:
  186. -->