Якщо вам не потрібно специфічний для класу XmlDocument функціонал, то простіше скористатися XDocument з простору імен System.Xml.Linq. Це дозволить отримати більш компактний код.
Для виведення на консоль в тому вигляді, який ви вказали є три шляхи.
1. Рекурсивний обхід дерева XML
Реалізується досить просто:
Але вставити в цей вод виборчу нумерацію конкретних елементів без "милиць" не вийде. "Милиця" для нумерації може виглядати так:
При цьому будуть пронумеровані всі елементи крім тих, які не містять в собі інших елементів.
2. Фіксований обхід дерева XML
З точки зору дерева, рекурсія зберігається, така вже структура дерева, але якщо ця структура фіксована і відома. то можна обійтися без рекурсивного виклику методів а використовувати ланцюжок викликів в циклі. Покажу на прикладі:
як бачите, рекурсія відсутня, але якщо структура XML буде відрізнятися від закладеної в коді, "все перетвориться на гарбуз" і буде давати невірні результати.
Можна виконати всю роботу руками, отримавши вихідний текст XML у вигляді тексту. Для цього можна скористатися будь-яким відомим вам способом отримання тексту з файлу.
Далі до рядка вихідного XML тексту застосовуємо різноманітні регулярні вирази або інші відомі вам способи перетворення рядка до отримання рядки або масиву рядків потрібного виду і виводимо отримане.
Наводити код даного способу не стану, так як варіантів для подібного рішення існує маса, а поглядів на те, як це зробити правильно ще більше. До того ж, я сильно сумніваюся, що подібний варіант буде істотно продуктивніше ніж два попередніх, скоріше навпаки.
Вибирайте якийсь варіант вам більше підходить =)