UPDATE:
Да, вы можете попытаться обработать 3 файла «параллельно», используя SAX-парсеры, если ваши обратные вызовы реализуют механизм «Сон / пробуждение / проверка, если другие SAX-парсеры сказали, что продолжают». В основном плохое приближение потоков и обмена сообщениями.
Это сработало бы только в том случае, если элементы в каждом XML-файле были упорядочены в одном и том же точном порядке и, в идеале, в алфавитном порядке - таким образом, вы можете перемещаться линейно внутри каждого файла с помощью SAX-анализатора и гарантировать, что вы попадете в идентичные элементы одновременно и, таким образом, одновременно хранит только 3-6 элементов в памяти. В основном это объединение 3 отсортированных массивов в 1 отсортированный массив.
Я серьезно сомневаюсь, что этот подход даже отдаленно превзошел бы исходный алгоритм, который я перечислил ниже, но если это то, что вы хотите попробовать реализовать, сделайте это.
ОРИГИНАЛ:
По сути, лучший (если не единственный) способ сделать то, что вы хотите, - это создать базу данных всех элементов, нуждающихся в слиянии.
Вероятно, отображение имени элемента или идентификатора элемента в N полей true / false, по одному для каждого файла XML; или даже одно значение «да / нет» для «уже объединено» - я буду использовать последний вариант в моем примере логики ниже.
Будет ли эта база данных реализована как хэш в памяти; или связанный хеш, сохраненный в файле, чтобы избежать проблем с памятью, или правильная база данных (реализованная как XML, или как SQLite, или DBM, или реальный сервер базы данных) менее важна; за исключением того, что первый вариант явно отстой в потреблении памяти.
Обратите внимание на опцию базы данных XML, поскольку вы МОЖЕТЕ использовать полученный XML-файл в качестве базы данных. На самом деле это может быть вашим самым простым вариантом, не уверен - я бы лично порекомендовал связанный хеш или реальный сервер базы данных, если он у вас есть.
Сделав это, алгоритм очевиден:
Зацикливание каждого файла с использованием SAX-парсера
По каждому найденному элементу найдите этот элемент в базе данных. если уже помечено как обработанное, пропустите. Если нет, добавить в базу данных как обработано.
Найдите этот же элемент во всех последующих файлах, используя XPath. Например. при обработке file2.xml ищите только file3.xml, поскольку file1.xml не имел бы элемента (иначе он был бы обработан из file1.xml и уже появился в базе данных).
Объедините все элементы, которые вы нашли с помощью XPath, а также элемент из текущего файла, вставьте в результирующий файл XML и сохраните его.
Конец обеих петель.
Обратите внимание, что в этом ответе не указывается напрямую, какие модули использовать для реализации каждого шага - предположительно, XML :: Parser или любой другой синтаксический анализатор sax для синтаксического анализа, XML :: XPath для поиска в других файлах и что-то вроде XML :: Я предполагаю, что SAX :: Writer для записи результирующего файла, хотя, поскольку мне никогда не приходилось писать файл в модели, отличной от DOM, я не хочу делать последние официальной рекомендацией; и если вы хотите узнать, какой модуль лучше для этого, вы можете сделать это отдельным вопросом или надеяться, что кто-то другой ответит на этот вопрос с более точными рекомендациями модуля.