This isn't a complete solution, but here's my idea for how to solve your problem: roll your own parser (shouldn't be too difficult, XML has simple syntax), keeping track of the current open node on a stack, popping it when the close tag is hit. When you hit a close tag that doesn't match the currently open tag, keep popping the stack until you reach the matching open tag. Then you should be able to keep the valid parts and ignore the rest.
EDIT: Come to think of it, you could probably use
XmlReader[
^] to do it, as long as you don't need anything after the malformed XML.