let rec diff_of_xmls (xml1:Xml.xml) (xml2:Xml.xml):(Xml.xml option*Xml.xml option) list =
match xml1=xml2 with
|true -> []
|false -> (
match xml1,xml2 with
|Xml.Element (tag1,attr_list1,xml_list1), Xml.Element (tag2,attr_list2,xml_list2) -> (
match tag1=tag2, attr_list1=attr_list2 with
|false,_ -> [(Some xml1, Some xml2)]
| _,false -> [(Some xml1, Some xml2)]
|true,true -> (
let rec aux (list1:Xml.xml list) (list2:Xml.xml list):(Xml.xml option*Xml.xml option) list=
match list1, list2 with
|hd1::tl1, hd2::tl2 -> List.concat [(diff_of_xmls hd1 hd2);(aux tl1 tl2)]
|[],hd2::tl2 -> (None, Some hd2)::(aux [] tl2)
|hd1::tl1,[] -> (Some hd1, None)::(aux tl1 [])
|[],[] -> []
in aux xml_list1 xml_list2
)
)
|Xml.PCData s, Xml.PCData t -> (
match s=t with
|false -> [(Some xml1, Some xml2)]
|true -> []
)
|x,y -> [(Some x, Some y)]
)