Я бы просто прочитал файл, обработал и выплюнул его обратно.
Это можно сделать потоковым способом с XmlReader - это больше ручная работа, чем XmlDocument или XDocument, но при этом избегается создание DOM в памяти (XmlDocument / XDocument можно использовать с этим же шаблон чтения / записи, но обычно требует полной реконструкции в памяти):
- Открыть файл входного потока файлов (XmlReader)
- Открыть поток выходного файла (XmlWriter, в другой файл )
- Чтение из XmlReader и запись в XmlWriter, выполняя любые преобразования как необходимые.
- Закрыть потоки
- Переместить новый файл в старый файл (перезапись, атомарное действие)
Хотя этот можно настроить для обработки ввода и вывода в одном и том же открытом файле с кучей действительно умных работ ничего не будет сохранено, и есть много вариантов, включая увеличение уменьшение длины файла. На самом деле, может быть медленнее пытаться просто сдвинуть содержимое файла назад, чтобы заполнить пробелы, или сдвинуть содержимое файла вперед, чтобы освободить место. Кэш файловой системы, скорее всего, сделает любой «выигрыш» минимальным / спорным для чего угодно, кроме самой основной операции сохранения длины. Кроме того, изменение файла на месте не является атомарным действием и, как правило, невозможно восстановить в случае ошибки: за счет временного файла подход чтения / записи / перемещения является атомарным по отношению к окончательное содержимое файла.
Или рассмотрим XSLT - он был разработан для этого; -)
Счастливого кодирования.