3 external dereference_object : 'a jvm_pointer -> unit = "dereference_object"
4 external get_null : unit -> 'a jvm_pointer = "getNull"
10 val init_document : node -> int -> t
14 type node = [`Node] jvm_pointer
16 type named_node_map = [`NamedNodeMap] jvm_pointer
20 external dereference_node : node -> unit = "dereference_object"
21 external dereference_named_node_map : named_node_map -> unit = "dereference_object"
23 external node_get_preorder : node -> int = "node_getPreorder"
26 external node_set_preorder : node -> int -> unit = "node_setPreorder"
29 external node_get_owner_element : node -> node = "attr_getOwnerElement"
32 external node_get_attributes : node -> named_node_map = "node_getAttributes"
35 external named_node_map_get_length : named_node_map -> int = "namednodemap_getLength"
41 external named_node_map_item : named_node_map -> int -> node = "namednodemap_item"
49 tag_cache : QName.t array
54 let dummy = get_null ()
58 let load_xml_file _ = assert false
59 let load_xml_string _ = assert false
60 let print_xml _ _ _ = assert false
65 external node_get_node_type : node -> int = "node_getNodeType"
67 let node_kind_of_int i =
73 | 7 -> ProcessingInstruction
76 | _ -> failwith ("Unimplemented document kind, please report " ^ string_of_int i)
80 external node_get_node_name : node -> string = "node_getNodeName"
83 assert (node != null);
84 node_kind_of_int (node_get_node_type node)
86 external node_get_first_child : node -> node = "node_getFirstChild"
88 external print_runtime_class : 'a jvm_pointer -> unit = "print_runtime_class"
89 let first_child _ node =
90 if node == nil then nil else
91 let attrs = node_get_attributes node in
93 node_get_first_child node
95 let len = named_node_map_get_length attrs in
96 if len == 0 (* possible ? *) then node_get_first_child node else
97 let at = named_node_map_item attrs 0 in
100 external node_get_next_sibling : node -> node = "node_getNextSibling"
103 let next_sibling tree node =
105 if node == nil then nil else
106 if (kind tree node) == Tree.NodeKind.Attribute then
109 let owner = node_get_owner_element node in
110 let own_pre = node_get_preorder owner in
111 let node_pre = node_get_preorder node in
112 let attrs = node_get_attributes owner in
113 let len = named_node_map_get_length attrs in
114 let i = node_pre - own_pre / 2 in
115 if i < len then named_node_map_item attrs i else
116 node_get_first_child owner
118 else node_get_next_sibling node
120 let parent _ _ = assert false
122 let data _ _ = assert false
125 if node == nil then QName.nil else
126 let pre = node_get_preorder node in
127 let label = tree.tag_cache.(pre) in
128 if label != QName.nil then label else
129 let label = node_get_node_name node in
132 match kind tree node with
133 | Document -> QName.document
135 | Attribute -> QName.attribute (QName.of_string label)
136 | ProcessingInstruction ->
137 QName.processing_instruction (QName.of_string label)
138 | _ -> QName.of_string label
141 tree.tag_cache.(pre) <- rlabel; rlabel
143 let preorder tree node =
144 if node == nil then -1 else
145 node_get_preorder node
148 dereference_object (t.root)
150 let init_document node i =
153 tag_cache = Array.create i QName.nil
156 Gc.finalise (finalize) s;
160 let print_node _ _ = assert false
161 let by_preorder _ _ = assert false
165 module Java_node_list : Node_list.S with type node = Java_tree.node
168 type node = Java_tree.node
169 type node_list = [`NodeList] jvm_pointer
171 external length : node_list -> int = "nodelist_getLength"
172 external create : unit -> node_list = "nodelist_new"
173 external add : node_list -> node -> node_list = "nodelist_add"
174 external item : node_list -> int -> node = "nodelist_item"
180 for i = 0 to length l - 1 do
186 module Runtime = Run.Make(Java_tree)(Java_node_list)
188 let _ = Callback.register "init_document" Java_tree.init_document
190 let xpath_compile p =
193 (Xpath.Parser.parse (Ulexing.from_utf8_string p))
195 Ata.print Format.err_formatter auto;
196 Format.pp_print_flush Format.err_formatter ();
199 let _ = Callback.register "xpath_compile" xpath_compile
201 let auto_evaluate auto tree list =
202 Runtime.eval auto tree list
204 let _ = Callback.register "auto_evaluate" auto_evaluate