Поскольку вы не уверены, что объявление всегда будет присутствовать, вы можете удалить все объявления (например, может найти их регулярное выражение <\?xml version.*\?>
), добавив <doc-collection>
, добавив </doc-collection>
, так что результирующая строка будет быть действительным XML-документом. В нем вы можете получить отдельные документы, используя (например) запрос XPath /doc-collection/*
. Если объединенный файл может быть достаточно большим, чтобы потребление памяти стало проблемой, вам может понадобиться потоковый анализатор, такой как Sax, но принцип остается тем же.
В аналогичном сценарии, с которым я столкнулся, я просто читаю составленный документ напрямую, используя xml-анализатор: хотя составной файл может не являться действительным xml документом , это действительный xml фрагмент (без повторных объявлений) - поэтому, если вы удалите объявления, если ваш анализатор поддерживает синтаксический анализ фрагментов, вы также можете просто прочитать результат напрямую. Все элементы верхнего уровня будут корневыми элементами объединенных документов.
Короче говоря, если вы удалите все объявления, у вас будет действительный xml-фрагмент, который легко разбирается напрямую или с помощью тега.