1
(* $Id: pull.ml 662 2004-05-25 20:57:28Z gerd $
2
* ----------------------------------------------------------------------
6
(**********************************************************************)
7
(* Examples for pull parsing *)
8
(**********************************************************************)
16
(* dump_event: dumps a single parsing event *)
20
E_start_doc(v,sa,dtd) ->
21
printf "E_start_doc version=%s standalone=%b\n" v sa
24
| E_start_tag(name,attlist,_) ->
25
printf "E_start_tag %s %s\n" name
26
(String.concat " " (List.map (fun (n,v) -> n ^ "=" ^ v) attlist))
27
| E_end_tag(name,_) ->
28
printf "E_end_tag %s\n" name
30
printf "E_char_data %s\n" data
31
| E_pinstr(target,data) ->
32
printf "E_pinstr %s %s\n" target data
34
printf "E_comment %s\n" data
35
| E_position(ent,line,col) ->
36
printf "E_position %s line=%d col=%d\n" ent line col
38
printf "E_error %s\n" (Printexc.to_string e)
40
printf "E_end_of_stream\n"
44
(* parse: prints the events while parsing the passed string *)
47
let config = default_config in
48
let mgr = create_entity_manager config (from_string s) in
50
create_pull_parser config (`Entry_content[]) mgr in
51
let event = ref (Some E_end_of_stream) in
52
while !event <> None do
53
event := next_event();
55
Some e -> dump_event e
63
* "<list><cons><int>34</int><cons><int>67</int><nil/></cons></cons></list>"
69
let rec parse_whole_list stream =
70
match stream with parser
71
[< 'E_start_tag("list",_,_);
78
and parse_sub_list stream =
79
match stream with parser
80
[< 'E_start_tag("cons",_,_);
82
tail = parse_sub_list;
87
| [< 'E_start_tag("nil",_,_); 'E_end_tag("nil",_) >] ->
90
and parse_object stream =
91
match stream with parser
92
[< 'E_start_tag("int",_,_);
98
and parse_text stream =
99
match stream with parser
100
[< 'E_char_data data;
108
{ default_config with
109
store_element_positions = false;
110
(* don't produce E_position events *)
113
let mgr = create_entity_manager config (from_string s) in
115
create_pull_parser config (`Entry_content[]) mgr in
116
let next_event_or_error n =
117
let e = next_event n in
119
Some(E_error exn) -> raise exn
123
Stream.from next_event_or_error in
124
parse_whole_list stream