適当に読み飛ばすXMLパーサ

CGIサイトの吐くXHTMLJavaXMLパーサで読み込もうとしたら、XHTML文書がいいかげんで読めない。JDK1.6付属のDOM実装もSAX実装もだめ。1.6から新設されたjavax.xml.stream も役に立たなかった。
しかたないので自力でほどほどにいいかげんに動くXMLパーサを作る。
いやぁ、いいかげんに作るって思ったより難しいな。
特にDOCTYPE宣言を解釈しないまま読み飛ばす処理とか。
早くも保守不能正規表現が次々とたまっていく。

※追記:いいかげんなXMLのDOCTYPE宣言を適当に読み飛ばす正規表現

(<[ \t\n\r]*![ \t\n\r]*[dD][oO][cC][tT][yY][pP][eE][ \t\n\r]+)((?:(?:[^<>\u0022\u0027 \t\n\r]+|(?:\u0022[^\u0022]*\u0022|\u0027[^\u0027]*\u0027)|<[ \t\n\r]*\?.*?\?[ \t\n\r]*>|<[ \t\n\r]*![ \t\n\r]*\-\-.*?\-\->|<[ \t\n\r]*![ \t\n\r]*(?:[^\- \t\n\r>]|\-[^\- \t\n\r>])[^ \t\n\r>]*[ \t\n\r]*(?:[^<>\u0022\u0027 \t\n\r]|[ \t\n\r]|(?:\u0022[^\u0022]*\u0022|\u0027[^\u0027]*\u0027))*[ \t\n\r]*>)[ \t\n\r]*?)+?)([ \t\n\r]*>)