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