File: Zend_Dom-Query.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (289 lines) | stat: -rw-r--r-- 13,136 bytes parent folder | download | duplicates (2)
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.
                            '&lt;div bar="foo baz"&gt;' würde passen, aber
                            '&lt;div bar="foo bazbat"&gt;' 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 '&gt;' 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>