Предоставленные вами примеры данных указывают на одну проблему, а вопрос и исключение, которые вы предоставили, указывают на другую. У вас есть несколько документов XML, соединенных вместе, каждый со своим собственным объявлением XML, или у вас есть фрагмент XML с несколькими элементами верхнего уровня?
Если это первое, то решение будет включать разбиение входного потока на несколько потоков и анализ каждого из них по отдельности. Это не обязательно означает, как предполагает один комментарий, реализацию синтаксического анализатора XML. Вы можете искать в строке объявления XML, не анализируя в ней ничего другого, при условии, что ваши входные данные не содержат разделов CDATA, которые содержат неэкранированные объявления XML. Вы можете написать файлоподобный объект, который возвращает символы из базового потока до тех пор, пока он не достигнет объявления XML, а затем обернуть его в функцию генератора, которая продолжает возвращать потоки до достижения EOF. Это не тривиально, но и не очень сложно.
Если у вас есть фрагмент XML с несколькими элементами верхнего уровня, вы можете просто обернуть их элементом XML и проанализировать все это.
Конечно, как и в случае большинства проблем, связанных с неправильным вводом XML, простейшим решением может быть просто исправить то, что вызывает неправильный ввод.