Один из возможных алгоритмов:
1) Получить список parent_id
узлов как уникальную коллекцию (не забудьте удалить дубликаты из всех коллекций)
2) Получить атрибуты id
в коллекции
3) Создать новую пустую коллекцию 'parents
'
4) Для каждого элемента в коллекции id
, если соответствующий элемент существует в коллекции parent_id
, то этот элемент является родительским для некоторого другого элемента. Вы добавляете этот идентификатор в новую коллекцию parents
, которую вы создали
5) Получив список родителей, свяжите это с деревом. Это ваши элементы дерева верхнего уровня.
6) После этого вы можете снова просмотреть коллекцию идентификаторов и просто добавить каждый элемент к своему родителю, используя атрибут parent_id
Поймите, что это не самая эффективная реализация, потому что вы перебираете коллекции несколько раз вместо того, чтобы делать все за один проход (алгоритм для которого, безусловно, будет другим). Так что, если коллекции небольшие, то вышеприведенный подход является хорошим. Но если у вас есть десятки тысяч элементов, просмотр коллекций несколько раз может отрицательно сказаться на производительности. Но этот подход быстр и прост в реализации. Так что имейте в виду компромисс.
Кроме того, поскольку вы только читаете XML и не манипулируете им, предпочитайте XMLReader
class вместо XMLDocument
.