struct
    type t = [`int of int | `string of string ]

    let to_string = function
    | `int i -> string_of_int i
    | `string s -> s

    let of_xml x = 
      try `int (ileaf_exn "Object-id_id" x)
      with _ -> (
        try `string (sleaf_exn "Object-id_str" x)
        with _ -> 
          invalid_arg (sprintf "Entrez.Make.Object_id.of_xml: %s" (string_of_tree x))
      )
  end