let validate_xml (path_to_dtd : string) (path_to_xml : string) : string =
let print_tokens = false in
try
let dtd:Dtd.dtd=Dtd.parse_file path_to_dtd in
let checked_dtd:Dtd.checked=Dtd.check dtd in
let xml:Xml.xml=
match path_to_xml with
|"-" -> Xml_right.parse_stdin print_tokens
|path -> Xml_right.parse_file print_tokens path
in
match xml with
|Xml.Element (entry_point, _, _) ->
let _=Dtd.prove checked_dtd entry_point xml in
String.concat " " [path_to_xml;"is an instance of";path_to_dtd;"with entry-point";entry_point]
| _ -> raise (Error (path_to_xml ^ " has no entry_point"))
with
|Xml_light_errors.Dtd_parse_error e -> raise (Error (String.concat " " [path_to_dtd;"->";"Xml_light_errors.Dtd_parse_error:";Dtd.parse_error e]))
|Xml_light_errors.Dtd_check_error e -> raise (Error (String.concat " " [path_to_dtd;"->";"Xml_light_errors.Dtd_check_error:";Dtd.check_error e]))
|Xml_light_errors.Dtd_prove_error e -> raise (Error (String.concat " " [path_to_dtd;path_to_xml;"->";"Xml_light_errors.Dtd_prove_error:";Dtd.prove_error e]))
|Xml_light_errors.Xml_error e -> raise (Error (String.concat " " [path_to_xml;"->";"Xml_light_errors.Xml_error:";Xml.error e]))
|Xml_light_errors.File_not_found e -> raise (Error (String.concat " " ["Xml_light_errors.File_not_found:";e]))
|Xml_right.Error e -> raise (Error (String.concat " " [path_to_xml;"->";"Xml_right.Error:";e]))