Если имеется в вижу, что есть множество мелких файлов XML общим объёмом 100Мб-1Гб, то применял следующие методы:
1. StringBuilder с заголовком, далее в него дописываю выдранные с помощью RegEx содержимые каждого из XML. В конце записываю в StringBuilder в шапку что требуется (например, число обработанных файлов), добавляю хвост интегрального XML - и вуаля.
2.Если не требуется шапку менять в конце работы, то открываю новый ZIP файл и пишу в его поток, который идёт сразу на диск (или в память, как требуется по ситуации). Получается ещё компактнее, раз так в 20-30 по памяти.
3. Можно и просто в буферизованный файловый поток писать, опять-же (см. пункт 2).
Выдирал всегда RegEx'ом только потому, что условия были простыми: найти начальный и замыкающий теги нужного куска XML. Если желательно форматирование, то можно слегка подшаманить при добавлении очередного найденного куска с дополнительными пробелами, табуляциями и \n(\r).