~ubuntu-branches/ubuntu/hardy/pxp/hardy

« back to all changes in this revision

Viewing changes to doc/manual/html/x550.html

  • Committer: Bazaar Package Importer
  • Author(s): Stefano Zacchiroli
  • Date: 2005-03-29 11:06:39 UTC
  • mfrom: (2.1.2 hoary)
  • Revision ID: james.westby@ubuntu.com-20050329110639-5p39hz1d4aq3r2ec
Tags: 1.1.95-6
* Rebuilt against ocaml 3.08.3
* No longer built with wlex support (since wlex is no longer supported
  upstream and corresponding package has been removed from the debian
  archive)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<HTML
2
 
><HEAD
3
 
><TITLE
4
 
>How to parse a document from an application</TITLE
5
 
><META
6
 
NAME="GENERATOR"
7
 
CONTENT="Modular DocBook HTML Stylesheet Version 1.46"><LINK
8
 
REL="HOME"
9
 
TITLE="The PXP user's guide"
10
 
HREF="index.html"><LINK
11
 
REL="UP"
12
 
TITLE="Using PXP"
13
 
HREF="c533.html"><LINK
14
 
REL="PREVIOUS"
15
 
TITLE="Using PXP"
16
 
HREF="c533.html"><LINK
17
 
REL="NEXT"
18
 
TITLE="Class-based processing of the node tree"
19
 
HREF="x677.html"><LINK
20
 
REL="STYLESHEET"
21
 
TYPE="text/css"
22
 
HREF="markup.css"></HEAD
23
 
><BODY
24
 
CLASS="SECT1"
25
 
BGCOLOR="#FFFFFF"
26
 
TEXT="#000000"
27
 
LINK="#0000FF"
28
 
VLINK="#840084"
29
 
ALINK="#0000FF"
30
 
><DIV
31
 
CLASS="NAVHEADER"
32
 
><TABLE
33
 
WIDTH="100%"
34
 
BORDER="0"
35
 
CELLPADDING="0"
36
 
CELLSPACING="0"
37
 
><TR
38
 
><TH
39
 
COLSPAN="3"
40
 
ALIGN="center"
41
 
>The PXP user's guide</TH
42
 
></TR
43
 
><TR
44
 
><TD
45
 
WIDTH="10%"
46
 
ALIGN="left"
47
 
VALIGN="bottom"
48
 
><A
49
 
HREF="c533.html"
50
 
>Prev</A
51
 
></TD
52
 
><TD
53
 
WIDTH="80%"
54
 
ALIGN="center"
55
 
VALIGN="bottom"
56
 
>Chapter 2. Using <SPAN
57
 
CLASS="ACRONYM"
58
 
>PXP</SPAN
59
 
></TD
60
 
><TD
61
 
WIDTH="10%"
62
 
ALIGN="right"
63
 
VALIGN="bottom"
64
 
><A
65
 
HREF="x677.html"
66
 
>Next</A
67
 
></TD
68
 
></TR
69
 
></TABLE
70
 
><HR
71
 
ALIGN="LEFT"
72
 
WIDTH="100%"></DIV
73
 
><DIV
74
 
CLASS="SECT1"
75
 
><H1
76
 
CLASS="SECT1"
77
 
><A
78
 
NAME="AEN550"
79
 
>2.2. How to parse a document from an application</A
80
 
></H1
81
 
><P
82
 
>Let me first give a rough overview of the object model of the parser. The
83
 
following items are represented by objects:
84
 
 
85
 
<P
86
 
></P
87
 
><UL
88
 
COMPACT="COMPACT"
89
 
><LI
90
 
STYLE="list-style-type: disc"
91
 
><P
92
 
><I
93
 
CLASS="EMPHASIS"
94
 
>Documents:</I
95
 
> The document representation is more or less the
96
 
anchor for the application; all accesses to the parsed entities start here. It
97
 
is described by the class <TT
98
 
CLASS="LITERAL"
99
 
>document</TT
100
 
> contained in the module
101
 
<TT
102
 
CLASS="LITERAL"
103
 
>Pxp_document</TT
104
 
>. You can get some global information, such
105
 
as the XML declaration the document begins with, the DTD of the document,
106
 
global processing instructions, and most important, the document tree. </P
107
 
></LI
108
 
><LI
109
 
STYLE="list-style-type: disc"
110
 
><P
111
 
><I
112
 
CLASS="EMPHASIS"
113
 
>The contents of documents:</I
114
 
> The contents have the structure
115
 
of a tree: Elements contain other elements and text<A
116
 
NAME="AEN562"
117
 
HREF="#FTN.AEN562"
118
 
>[1]</A
119
 
>. 
120
 
 
121
 
The common type to represent both kinds of content is <TT
122
 
CLASS="LITERAL"
123
 
>node</TT
124
 
>
125
 
which is a class type that unifies the properties of elements and character
126
 
data. Every node has a list of children (which is empty if the element is empty
127
 
or the node represents text); nodes may have attributes; nodes have always text
128
 
contents. There are two implementations of <TT
129
 
CLASS="LITERAL"
130
 
>node</TT
131
 
>, the class
132
 
<TT
133
 
CLASS="LITERAL"
134
 
>element_impl</TT
135
 
> for elements, and the class
136
 
<TT
137
 
CLASS="LITERAL"
138
 
>data_impl</TT
139
 
> for text data. You find these classes and class
140
 
types in the module <TT
141
 
CLASS="LITERAL"
142
 
>Pxp_document</TT
143
 
>, too.</P
144
 
><P
145
 
>Note that attribute lists are represented by non-class values.</P
146
 
></LI
147
 
><LI
148
 
STYLE="list-style-type: disc"
149
 
><P
150
 
><I
151
 
CLASS="EMPHASIS"
152
 
>The node extension:</I
153
 
> For advanced usage, every node of the
154
 
document may have an associated <I
155
 
CLASS="EMPHASIS"
156
 
>extension</I
157
 
> which is simply
158
 
a second object. This object must have the three methods
159
 
<TT
160
 
CLASS="LITERAL"
161
 
>clone</TT
162
 
>, <TT
163
 
CLASS="LITERAL"
164
 
>node</TT
165
 
>, and
166
 
<TT
167
 
CLASS="LITERAL"
168
 
>set_node</TT
169
 
> as bare minimum, but you are free to add methods as
170
 
you want. This is the preferred way to add functionality to the document
171
 
tree<A
172
 
NAME="AEN582"
173
 
HREF="#FTN.AEN582"
174
 
>[2]</A
175
 
>. The class type <TT
176
 
CLASS="LITERAL"
177
 
>extension</TT
178
 
> is
179
 
defined in <TT
180
 
CLASS="LITERAL"
181
 
>Pxp_document</TT
182
 
>, too.</P
183
 
></LI
184
 
><LI
185
 
STYLE="list-style-type: disc"
186
 
><P
187
 
><I
188
 
CLASS="EMPHASIS"
189
 
>The DTD:</I
190
 
> Sometimes it is necessary to access the DTD of a
191
 
document; the average application does not need this feature. The class
192
 
<TT
193
 
CLASS="LITERAL"
194
 
>dtd</TT
195
 
> describes DTDs, and makes it possible to get
196
 
representations of element, entity, and notation declarations as well as
197
 
processing instructions contained in the DTD. This class, and
198
 
<TT
199
 
CLASS="LITERAL"
200
 
>dtd_element</TT
201
 
>, <TT
202
 
CLASS="LITERAL"
203
 
>dtd_notation</TT
204
 
>, and
205
 
<TT
206
 
CLASS="LITERAL"
207
 
>proc_instruction</TT
208
 
> can be found in the module
209
 
<TT
210
 
CLASS="LITERAL"
211
 
>Pxp_dtd</TT
212
 
>. There are a couple of classes representing
213
 
different kinds of entities; these can be found in the module
214
 
<TT
215
 
CLASS="LITERAL"
216
 
>Pxp_entity</TT
217
 
>. </P
218
 
></LI
219
 
></UL
220
 
>
221
 
 
222
 
Additionally, the following modules play a role:
223
 
 
224
 
<P
225
 
></P
226
 
><UL
227
 
COMPACT="COMPACT"
228
 
><LI
229
 
STYLE="list-style-type: disc"
230
 
><P
231
 
><I
232
 
CLASS="EMPHASIS"
233
 
>Pxp_yacc:</I
234
 
> Here the main parsing functions such as
235
 
<TT
236
 
CLASS="LITERAL"
237
 
>parse_document_entity</TT
238
 
> are located. Some additional types and
239
 
functions allow the parser to be configured in a non-standard way.</P
240
 
></LI
241
 
><LI
242
 
STYLE="list-style-type: disc"
243
 
><P
244
 
><I
245
 
CLASS="EMPHASIS"
246
 
>Pxp_types:</I
247
 
> This is a collection of basic types and
248
 
exceptions. </P
249
 
></LI
250
 
></UL
251
 
>
252
 
 
253
 
There are some further modules that are needed internally but are not part of
254
 
the API.</P
255
 
><P
256
 
>Let the document to be parsed be stored in a file called
257
 
<TT
258
 
CLASS="LITERAL"
259
 
>doc.xml</TT
260
 
>. The parsing process is started by calling the
261
 
function
262
 
 
263
 
<PRE
264
 
CLASS="PROGRAMLISTING"
265
 
>val parse_document_entity : config -&#62; source -&#62; 'ext spec -&#62; 'ext document</PRE
266
 
>
267
 
 
268
 
defined in the module <TT
269
 
CLASS="LITERAL"
270
 
>Pxp_yacc</TT
271
 
>. The first argument
272
 
specifies some global properties of the parser; it is recommended to start with
273
 
the <TT
274
 
CLASS="LITERAL"
275
 
>default_config</TT
276
 
>. The second argument determines where the
277
 
document to be parsed comes from; this may be a file, a channel, or an entity
278
 
ID. To parse <TT
279
 
CLASS="LITERAL"
280
 
>doc.xml</TT
281
 
>, it is sufficient to pass
282
 
<TT
283
 
CLASS="LITERAL"
284
 
>from_file "doc.xml"</TT
285
 
>. </P
286
 
><P
287
 
>The third argument passes the object specification to use. Roughly
288
 
speaking, it determines which classes implement the node objects of which
289
 
element types, and which extensions are to be used. The <TT
290
 
CLASS="LITERAL"
291
 
>'ext</TT
292
 
>
293
 
polymorphic variable is the type of the extension. For the moment, let us
294
 
simply pass <TT
295
 
CLASS="LITERAL"
296
 
>default_spec</TT
297
 
> as this argument, and ignore it.</P
298
 
><P
299
 
>So the following expression parses <TT
300
 
CLASS="LITERAL"
301
 
>doc.xml</TT
302
 
>:
303
 
 
304
 
<PRE
305
 
CLASS="PROGRAMLISTING"
306
 
>open Pxp_yacc
307
 
let d = parse_document_entity default_config (from_file "doc.xml") default_spec</PRE
308
 
>
309
 
 
310
 
Note that <TT
311
 
CLASS="LITERAL"
312
 
>default_config</TT
313
 
> implies that warnings are collected
314
 
but not printed. Errors raise one of the exception defined in
315
 
<TT
316
 
CLASS="LITERAL"
317
 
>Pxp_types</TT
318
 
>; to get readable errors and warnings catch the
319
 
exceptions as follows:
320
 
 
321
 
<PRE
322
 
CLASS="PROGRAMLISTING"
323
 
>class warner =
324
 
  object 
325
 
    method warn w =
326
 
      print_endline ("WARNING: " ^ w)
327
 
  end
328
 
;;
329
 
 
330
 
try
331
 
  let config = { default_config with warner = new warner } in
332
 
  let d = parse_document_entity config (from_file "doc.xml") default_spec
333
 
  in
334
 
    ...
335
 
with
336
 
   e -&#62;
337
 
     print_endline (Pxp_types.string_of_exn e)</PRE
338
 
>
339
 
 
340
 
Now <TT
341
 
CLASS="LITERAL"
342
 
>d</TT
343
 
> is an object of the <TT
344
 
CLASS="LITERAL"
345
 
>document</TT
346
 
>
347
 
class. If you want the node tree, you can get the root element by
348
 
 
349
 
<PRE
350
 
CLASS="PROGRAMLISTING"
351
 
>let root = d # root</PRE
352
 
>
353
 
 
354
 
and if you would rather like to access the DTD, determine it by
355
 
 
356
 
<PRE
357
 
CLASS="PROGRAMLISTING"
358
 
>let dtd = d # dtd</PRE
359
 
>
360
 
 
361
 
As it is more interesting, let us investigate the node tree now. Given the root
362
 
element, it is possible to recursively traverse the whole tree. The children of
363
 
a node <TT
364
 
CLASS="LITERAL"
365
 
>n</TT
366
 
> are returned by the method
367
 
<TT
368
 
CLASS="LITERAL"
369
 
>sub_nodes</TT
370
 
>, and the type of a node is returned by
371
 
<TT
372
 
CLASS="LITERAL"
373
 
>node_type</TT
374
 
>. This function traverses the tree, and prints the
375
 
type of each node:
376
 
 
377
 
<PRE
378
 
CLASS="PROGRAMLISTING"
379
 
>let rec print_structure n =
380
 
  let ntype = n # node_type in
381
 
  match ntype with
382
 
    T_element name -&#62;
383
 
      print_endline ("Element of type " ^ name);
384
 
      let children = n # sub_nodes in
385
 
      List.iter print_structure children
386
 
  | T_data -&#62;
387
 
      print_endline "Data"
388
 
  | _ -&#62;
389
 
      (* Other node types are not possible unless the parser is configured
390
 
         differently.
391
 
       *)
392
 
      assert false</PRE
393
 
>
394
 
 
395
 
You can call this function by
396
 
 
397
 
<PRE
398
 
CLASS="PROGRAMLISTING"
399
 
>print_structure root</PRE
400
 
>
401
 
 
402
 
The type returned by <TT
403
 
CLASS="LITERAL"
404
 
>node_type</TT
405
 
> is either <TT
406
 
CLASS="LITERAL"
407
 
>T_element
408
 
name</TT
409
 
> or <TT
410
 
CLASS="LITERAL"
411
 
>T_data</TT
412
 
>. The <TT
413
 
CLASS="LITERAL"
414
 
>name</TT
415
 
> of the
416
 
element type is the string included in the angle brackets. Note that only
417
 
elements have children; data nodes are always leaves of the tree.</P
418
 
><P
419
 
>There are some more methods in order to access a parsed node tree:
420
 
 
421
 
<P
422
 
></P
423
 
><UL
424
 
COMPACT="COMPACT"
425
 
><LI
426
 
STYLE="list-style-type: disc"
427
 
><P
428
 
><TT
429
 
CLASS="LITERAL"
430
 
>n # parent</TT
431
 
>: Returns the parent node, or raises
432
 
<TT
433
 
CLASS="LITERAL"
434
 
>Not_found</TT
435
 
> if the node is already the root</P
436
 
></LI
437
 
><LI
438
 
STYLE="list-style-type: disc"
439
 
><P
440
 
><TT
441
 
CLASS="LITERAL"
442
 
>n # root</TT
443
 
>: Returns the root of the node tree. </P
444
 
></LI
445
 
><LI
446
 
STYLE="list-style-type: disc"
447
 
><P
448
 
><TT
449
 
CLASS="LITERAL"
450
 
>n # attribute a</TT
451
 
>: Returns the value of the attribute with
452
 
name <TT
453
 
CLASS="LITERAL"
454
 
>a</TT
455
 
>. The method returns a value for every
456
 
<I
457
 
CLASS="EMPHASIS"
458
 
>declared</I
459
 
> attribute, independently of whether the attribute
460
 
instance is defined or not. If the attribute is not declared,
461
 
<TT
462
 
CLASS="LITERAL"
463
 
>Not_found</TT
464
 
> will be raised. (In well-formedness mode, every
465
 
existing attribute is considered as being implicitly declared with type
466
 
<TT
467
 
CLASS="LITERAL"
468
 
>CDATA</TT
469
 
>, so you will get either <TT
470
 
CLASS="LITERAL"
471
 
>Value s</TT
472
 
>
473
 
or an exception <TT
474
 
CLASS="LITERAL"
475
 
>Not_found</TT
476
 
>.) </P
477
 
><P
478
 
>The following return values are possible: <TT
479
 
CLASS="LITERAL"
480
 
>Value s</TT
481
 
>, 
482
 
<TT
483
 
CLASS="LITERAL"
484
 
>Valuelist sl</TT
485
 
> , and <TT
486
 
CLASS="LITERAL"
487
 
>Implied_value</TT
488
 
>. 
489
 
The first two value types indicate that the attribute value is available,
490
 
either because there is a definition
491
 
<TT
492
 
CLASS="LITERAL"
493
 
><TT
494
 
CLASS="REPLACEABLE"
495
 
><I
496
 
>a</I
497
 
></TT
498
 
>="<TT
499
 
CLASS="REPLACEABLE"
500
 
><I
501
 
>value</I
502
 
></TT
503
 
>"</TT
504
 
>
505
 
in the XML text, or because there is a default value (declared in the
506
 
DTD). Only if both the instance definition and the default declaration are
507
 
missing, the latter value <TT
508
 
CLASS="LITERAL"
509
 
>Implied_value</TT
510
 
> will be returned.</P
511
 
><P
512
 
>In the DTD, every attribute is typed. There are single-value types (CDATA, ID,
513
 
IDREF, ENTITY, NMTOKEN, enumerations), in which case the method passes
514
 
<TT
515
 
CLASS="LITERAL"
516
 
>Value s</TT
517
 
> back, where <TT
518
 
CLASS="LITERAL"
519
 
>s</TT
520
 
> is the normalized
521
 
string value of the attribute. The other types (IDREFS, ENTITIES, NMTOKENS)
522
 
represent list values, and the parser splits the XML literal into several
523
 
tokens and returns these tokens as <TT
524
 
CLASS="LITERAL"
525
 
>Valuelist sl</TT
526
 
>.</P
527
 
><P
528
 
>Normalization means that entity references (the
529
 
<TT
530
 
CLASS="LITERAL"
531
 
>&amp;<TT
532
 
CLASS="REPLACEABLE"
533
 
><I
534
 
>name</I
535
 
></TT
536
 
>;</TT
537
 
> tokens) and
538
 
character references
539
 
(<TT
540
 
CLASS="LITERAL"
541
 
>&amp;#<TT
542
 
CLASS="REPLACEABLE"
543
 
><I
544
 
>number</I
545
 
></TT
546
 
>;</TT
547
 
>) are replaced
548
 
by the text they represent, and that white space characters are converted into
549
 
plain spaces.</P
550
 
></LI
551
 
><LI
552
 
STYLE="list-style-type: disc"
553
 
><P
554
 
><TT
555
 
CLASS="LITERAL"
556
 
>n # data</TT
557
 
>: Returns the character data contained in the
558
 
node. For data nodes, the meaning is obvious as this is the main content of
559
 
data nodes. For element nodes, this method returns the concatenated contents of
560
 
all inner data nodes.</P
561
 
><P
562
 
>Note that entity references included in the text are resolved while they are
563
 
being parsed; for example the text "a &#38;lt;&#38;gt; b" will be returned
564
 
as "a &#60;&#62; b" by this method. Spaces of data nodes are always
565
 
preserved. Newlines are preserved, but always converted to \n characters even
566
 
if newlines are encoded as \r\n or \r. Normally you will never see two adjacent
567
 
data nodes because the parser collapses all data material at one location into
568
 
one node. (However, if you create your own tree or transform the parsed tree,
569
 
it is possible to have adjacent data nodes.)</P
570
 
><P
571
 
>Note that elements that do <I
572
 
CLASS="EMPHASIS"
573
 
>not</I
574
 
> allow #PCDATA as content
575
 
will not have data nodes as children. This means that spaces and newlines, the
576
 
only character material allowed for such elements, are silently dropped.</P
577
 
></LI
578
 
></UL
579
 
>
580
 
 
581
 
For example, if the task is to print all contents of elements with type
582
 
"valuable" whose attribute "priority" is "1", this function can help:
583
 
 
584
 
<PRE
585
 
CLASS="PROGRAMLISTING"
586
 
>let rec print_valuable_prio1 n =
587
 
  let ntype = n # node_type in
588
 
  match ntype with
589
 
    T_element "valuable" when n # attribute "priority" = Value "1" -&#62;
590
 
      print_endline "Valuable node with priotity 1 found:";
591
 
      print_endline (n # data)
592
 
  | (T_element _ | T_data) -&#62;
593
 
      let children = n # sub_nodes in
594
 
      List.iter print_valuable_prio1 children
595
 
  | _ -&#62;
596
 
      assert false</PRE
597
 
>
598
 
 
599
 
You can call this function by:
600
 
 
601
 
<PRE
602
 
CLASS="PROGRAMLISTING"
603
 
>print_valuable_prio1 root</PRE
604
 
>
605
 
 
606
 
If you like a DSSSL-like style, you can make the function
607
 
<TT
608
 
CLASS="LITERAL"
609
 
>process_children</TT
610
 
> explicit:
611
 
 
612
 
<PRE
613
 
CLASS="PROGRAMLISTING"
614
 
>let rec print_valuable_prio1 n =
615
 
 
616
 
  let process_children n =
617
 
    let children = n # sub_nodes in
618
 
    List.iter print_valuable_prio1 children 
619
 
  in
620
 
 
621
 
  let ntype = n # node_type in
622
 
  match ntype with
623
 
    T_element "valuable" when n # attribute "priority" = Value "1" -&#62;
624
 
      print_endline "Valuable node with priority 1 found:";
625
 
      print_endline (n # data)
626
 
  | (T_element _ | T_data) -&#62;
627
 
      process_children n
628
 
  | _ -&#62;
629
 
      assert false</PRE
630
 
>
631
 
 
632
 
So far, O'Caml is now a simple "style-sheet language": You can form a big
633
 
"match" expression to distinguish between all significant cases, and provide
634
 
different reactions on different conditions. But this technique has
635
 
limitations; the "match" expression tends to get larger and larger, and it is
636
 
difficult to store intermediate values as there is only one big
637
 
recursion. Alternatively, it is also possible to represent the various cases as
638
 
classes, and to use dynamic method lookup to find the appropiate class. The
639
 
next section explains this technique in detail.&#13;</P
640
 
></DIV
641
 
><H3
642
 
CLASS="FOOTNOTES"
643
 
>Notes</H3
644
 
><TABLE
645
 
BORDER="0"
646
 
CLASS="FOOTNOTES"
647
 
WIDTH="100%"
648
 
><TR
649
 
><TD
650
 
ALIGN="LEFT"
651
 
VALIGN="TOP"
652
 
WIDTH="5%"
653
 
><A
654
 
NAME="FTN.AEN562"
655
 
HREF="x550.html#AEN562"
656
 
>[1]</A
657
 
></TD
658
 
><TD
659
 
ALIGN="LEFT"
660
 
VALIGN="TOP"
661
 
WIDTH="95%"
662
 
><P
663
 
>Elements may
664
 
also contain processing instructions. Unlike other document models, <SPAN
665
 
CLASS="ACRONYM"
666
 
>PXP</SPAN
667
 
>
668
 
separates processing instructions from the rest of the text and provides a
669
 
second interface to access them (method <TT
670
 
CLASS="LITERAL"
671
 
>pinstr</TT
672
 
>). However,
673
 
there is a parser option (<TT
674
 
CLASS="LITERAL"
675
 
>enable_pinstr_nodes</TT
676
 
>) which changes
677
 
the behaviour of the parser such that extra nodes for processing instructions
678
 
are included into the tree.</P
679
 
><P
680
 
>Furthermore, the tree does normally not contain nodes for XML comments;
681
 
they are ignored by default. Again, there is an option
682
 
(<TT
683
 
CLASS="LITERAL"
684
 
>enable_comment_nodes</TT
685
 
>) changing this.</P
686
 
></TD
687
 
></TR
688
 
><TR
689
 
><TD
690
 
ALIGN="LEFT"
691
 
VALIGN="TOP"
692
 
WIDTH="5%"
693
 
><A
694
 
NAME="FTN.AEN582"
695
 
HREF="x550.html#AEN582"
696
 
>[2]</A
697
 
></TD
698
 
><TD
699
 
ALIGN="LEFT"
700
 
VALIGN="TOP"
701
 
WIDTH="95%"
702
 
><P
703
 
>Due to the typing system it is more or less impossible to
704
 
derive recursive classes in O'Caml. To get around this, it is common practice
705
 
to put the modifiable or extensible part of recursive objects into parallel
706
 
objects.</P
707
 
></TD
708
 
></TR
709
 
></TABLE
710
 
><DIV
711
 
CLASS="NAVFOOTER"
712
 
><HR
713
 
ALIGN="LEFT"
714
 
WIDTH="100%"><TABLE
715
 
WIDTH="100%"
716
 
BORDER="0"
717
 
CELLPADDING="0"
718
 
CELLSPACING="0"
719
 
><TR
720
 
><TD
721
 
WIDTH="33%"
722
 
ALIGN="left"
723
 
VALIGN="top"
724
 
><A
725
 
HREF="c533.html"
726
 
>Prev</A
727
 
></TD
728
 
><TD
729
 
WIDTH="34%"
730
 
ALIGN="center"
731
 
VALIGN="top"
732
 
><A
733
 
HREF="index.html"
734
 
>Home</A
735
 
></TD
736
 
><TD
737
 
WIDTH="33%"
738
 
ALIGN="right"
739
 
VALIGN="top"
740
 
><A
741
 
HREF="x677.html"
742
 
>Next</A
743
 
></TD
744
 
></TR
745
 
><TR
746
 
><TD
747
 
WIDTH="33%"
748
 
ALIGN="left"
749
 
VALIGN="top"
750
 
>Using <SPAN
751
 
CLASS="ACRONYM"
752
 
>PXP</SPAN
753
 
></TD
754
 
><TD
755
 
WIDTH="34%"
756
 
ALIGN="center"
757
 
VALIGN="top"
758
 
><A
759
 
HREF="c533.html"
760
 
>Up</A
761
 
></TD
762
 
><TD
763
 
WIDTH="33%"
764
 
ALIGN="right"
765
 
VALIGN="top"
766
 
>Class-based processing of the node tree</TD
767
 
></TR
768
 
></TABLE
769
 
></DIV
770
 
></BODY
771
 
></HTML
772
 
>
 
 
b'\\ No newline at end of file'