+
+let print_attribute attr =
+ check_attribute_ns attr;
+ let ns_uri = Minidom.attr_get_ns_uri attr
+ in
+ begin
+ match ns_uri with
+ Some uri -> Printf.printf " %s:" (Minidom.string_of_mDOMString uri);
+ | None -> ()
+ end;
+ match ((Minidom.attr_get_name attr), (Minidom.attr_get_value attr)) with
+ (Some attr_name, Some attr_value) ->
+ Printf.printf " %s=\"%s\"" (Minidom.string_of_mDOMString attr_name) (Minidom.string_of_mDOMString attr_value)
+ | (Some attr_name, _) ->
+ Printf.printf " ??? attribute %s has no value !!!" (Minidom.string_of_mDOMString attr_name)
+ | (_,_) ->
+ Printf.printf " ??? very strange attribute !!!"
+;;
+
+let rec print_node n node =
+ if Minidom.node_is_blank node then ()
+ else if Minidom.node_is_element node then begin
+ match Minidom.node_get_name node with
+ Some node_name ->
+ begin
+ let children = Minidom.node_get_children node
+ and attributes = Minidom.node_get_attributes node
+ and ns_uri = Minidom.node_get_ns_uri node
+ and is_first,is_last = (Minidom.node_is_first node), (Minidom.node_is_last node)
+ in
+ for i = 1 to n do print_char ' ' done;
+ Printf.printf "<";
+ begin
+ match ns_uri with
+ Some uri -> Printf.printf "%s:" (Minidom.string_of_mDOMString uri)
+ | None -> ()
+ end;
+ Printf.printf "%s" (Minidom.string_of_mDOMString node_name);
+ List.iter print_attribute attributes;
+ Printf.printf ">\n";
+ List.iter (print_node (n + 2)) children;
+ for i = 1 to n do print_char ' ' done;
+ Printf.printf "</%s>\n" (Minidom.string_of_mDOMString node_name)
+ end
+ | None -> Printf.printf "??? this node has no name !!!\n"
+ end else if Minidom.node_is_text node then begin
+ match Minidom.node_get_content node with
+ Some node_content ->
+ for i = 1 to n do print_char ' ' done;
+ Printf.printf "%s\n" (Minidom.string_of_mDOMString node_content)
+ | None -> Printf.printf "??? this node has no content !!!\n"
+ end else begin
+ Printf.printf "don't know how to manage a node with type %d\n" (Minidom.node_get_type node)
+ end
+;;
+
+print_node 0 root;;