(String : String)
(Buffer : sig
            type string = String.t
            type t
            exception Full
            val create : int -> t
            val add_uchar : t -> int -> unit
            val clear : t -> unit
            val contents : t -> string
            val length : t -> int
          end)
  ->
  sig
    type string = String.t
    type encoding =
        [ `ISO_8859_1 | `US_ASCII | `UTF_16 | `UTF_16BE | `UTF_16LE | `UTF_8
        ]
    type dtd = string option
    type name = string * string
    type attribute = name * string
    type tag = name * attribute list
    type signal =
        [ `Data of string | `Dtd of dtd | `El_end | `El_start of tag ]
    val ns_xml : string
    val ns_xmlns : string
    type pos = int * int
    type error =
        [ `Expected_char_seqs of string list * string
        | `Expected_root_element
        | `Illegal_char_ref of string
        | `Illegal_char_seq of string
        | `Malformed_char_stream
        | `Max_buffer_size
        | `Unexpected_eoi
        | `Unknown_encoding of string
        | `Unknown_entity_ref of string
        | `Unknown_ns_prefix of string ]
    exception Error of pos * error
    val error_message : error -> string
    type source =
        [ `Channel of in_channel
        | `Fun of unit -> int
        | `String of int * std_string ]
    type input
    val make_input :
      ?enc:encoding option ->
      ?strip:bool ->
      ?ns:(string -> string option) ->
      ?entity:(string -> string option) -> source -> input
    val input : input -> signal
    val input_tree :
      el:(tag -> 'a list -> 'a) -> data:(string -> 'a) -> input -> 'a
    val input_doc_tree :
      el:(tag -> 'a list -> 'a) -> data:(string -> 'a) -> input -> dtd * 'a
    val peek : input -> signal
    val eoi : input -> bool
    val pos : input -> pos
    type 'a frag = [ `Data of string | `El of tag * 'a list ]
    type dest =
        [ `Buffer of std_buffer
        | `Channel of out_channel
        | `Fun of int -> unit ]
    type output
    val make_output :
      ?decl:bool ->
      ?nl:bool ->
      ?indent:int option ->
      ?ns_prefix:(string -> string option) -> dest -> output
    val output_depth : output -> int
    val output : output -> signal -> unit
    val output_tree : ('-> 'a frag) -> output -> '-> unit
    val output_doc_tree : ('-> 'a frag) -> output -> dtd * '-> unit
  end