Мне сложно найти пакет узла, который может анализировать большие XML-файлы размером 1G +. Наш внутренний сервер - это в первую очередь node.js, поэтому мне не хотелось бы создавать еще одну службу на другом языке / платформе только для анализа xml и записи данных в базу данных. Кто-нибудь имел успех, делая такие вещи в узле? Что вы использовали? Я просмотрел кучу пакетов, таких как xml-stream, big-xml и т. д., И у всех есть свои проблемы. Некоторые даже не могут скомпилироваться на Mac (и кажутся устаревшими и больше не поддерживаются). Мне действительно не нужно преобразовывать проанализированные результаты в объекты js или что-то в этом роде. Просто нужно разобраться в данных, а затем записать в базу данных.
Вы это проверили? github.com/isaacs/sax-js.
@ MichałKapracki: да, я пробовал саксофон, но он кажется чертовски медленным и громоздким в использовании.
Хм ... странно. Насколько я помню, sax был на самом деле быстрее, чем libxml. У меня сейчас нет времени, но я проверю и попробую соединить несколько образцов с ГПД, как я хотел, и опубликовать свои выводы по синтаксическим анализаторам здесь ...
Самый очевидный, но не очень полезный ответ - это то, что это зависит от требований.
Однако в вашем случае это кажется довольно простым; вам необходимо загрузить большие фрагменты данных, которые могут поместиться или не поместиться в памяти, для простой обработки перед их записью в базу данных. Я думаю, что это уже одна хорошая причина, по которой вы захотите вывести работу процессора как отдельные процессы. Поэтому, вероятно, было бы разумнее сначала сосредоточиться на том, какой анализатор XML выполняет эту работу за вас, а не на том, какую оболочку узла вы хотите использовать для этого.
Очевидно, что любой синтаксический анализатор, который требует, чтобы весь документ был загружен в память перед обработкой, не является допустимым вариантом. Для этого вам нужно будет использовать потоки и парсеры, поддерживающие такую последовательную обработку.
Это оставляет вам несколько вариантов:
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())
Конечно, я понятия не имею, как будет выглядеть ваш поток записи в базу данных, поэтому здесь я просто записываю его в файл.
эй :) если вы не знали, что существует узел 'person' - как вы могли бы разобрать этот xml?
Да, я также ищу что-нибудь разумное для использования с моим каркас ГПВД - это может быть то, что вы, возможно, захотите использовать на более позднем этапе, но оно должно быть снабжено чем-то вроде "саксофонного" процессора ...