Как уже говорили другие, ваш XML определенно недействителен. Однако, если вы не можете изменить генерирующее приложение и можете добавить шаг очистки, тогда следует очистить XML:
String clean = xml.replaceAll( "&([^;]+(?!(?:\\w|;)))", "&$1" );
То, что делает это регулярное выражение, ищет любые плохо сформированные ссылки на сущности и избегает амперсанда.
В частности, (?!(?:\\w|;))
является негативным прогнозом, который останавливает это совпадение на всем, что не является символом слова (a-z, 0-9) и не является точкой с запятой. Таким образом, все регулярные выражения извлекают все из &, что не является; вплоть до первого не состоящего в слове символа, не являющегося точкой с запятой.
Он помещает все, кроме амперсанда, в первую группу захвата, чтобы на него можно было ссылаться в строке замены. Это $ 1.
Обратите внимание, что это не исправит ссылки, которые выглядят как действительные, но это не так. Например, если у вас был & T; это привело бы к совершенно другому типу ошибки, если XML фактически не определяет сущность.