Самый очевидный, но не очень полезный ответ, это то, что это зависит от требований.
В вашем случае, однако, это кажется довольно простым; вам нужно загрузить большие куски данных, которые могут или не могут поместиться в памяти, для простой обработки перед записью их в базу данных. Я думаю, что это только одна веская причина, по которой вы хотели бы использовать этот процессор как отдельные процессы. Поэтому, вероятно, было бы более целесообразно сначала сосредоточиться на том, какой синтаксический анализатор XML выполняет эту работу за вас, а не на какой обертке Node, которую вы хотите использовать для него.
Очевидно, что любой синтаксический анализатор, требующий загрузки всего документа в память перед обработкой, не является допустимым параметром. Для этого вам нужно будет использовать потоки и парсеры, поддерживающие такую последовательную обработку.
Это оставляет вам несколько вариантов:
Saxon, похоже, имеет наивысший уровень соответствия недавним W3C спецификациям, поэтому, если проверка схемы и тому подобное важна, это может быть хорошим кандидатом. В противном случае, как Libxml, так и Expat, похоже, складываются довольно неплохо с точки зрения производительности и уже предустановлены в большинстве операционных систем.
Оболочки Node доступны для всех из них:
Моя реализация Node будет выглядеть примерно так:
import * as XmlStream from 'xml-stream'
import { request } from 'http'
import { createWriteStream } from 'fs'
const xmlFileReadStream = request('http://external.path/to/xml')
const xmlFileWriteStream = new XmlStream(xmlFileReadStream)
const databaseWriteStream = createWriteStream('/path/to/file.csv')
xmlFileWriteStream.on('endElement: Person', ({ name, phone, age }) =>
databaseWriteStream.write(`"${name}","${phone}","${age}"\n`))
xmlFileWriteStream.on('end', () => databaseWriteStream.end())
Конечно, я понятия не имею, как будет выглядеть поток записи в вашу базу данных, поэтому здесь я просто записываю его в файл.