Se você está trabalhando com dados legados, muitas vezes
deve ter problemas com o tamanho dos dados. Um tempo atrás, eu tive que
analisar grandes arquivos XML, extrair alguns dados, convertê-los, adicionar
manualmente os dados gerados e então salvar o output em um arquivo JSON.
(Precisamos disso porque mais tarde esse arquivo será usado como input para
nosso componente ExtJS/Sencha).
Na minha máquina de desenvolvimento, o NodeJS já está instalado. Dê uma
olhada no guia de instalação NodeJS, se você quiser
instalá-lo. Agora você pode escrever programas executáveis em JavaScript
baseados no mecanismo V8 do Google.
Eu fiz o download da SAX XML
parser library para o NodeJS (escrita por isaacs). É bastante fácil incluí-la no
meu espaço de trabalho, apenas adicione uma linha simples para incluir
“sax.js”. O segundo componente de que preciso é o arquivo do sistema para ler o
conteúdo do arquivo XML.
var fs = require('fs');
var sax = require('./sax');
A primeira coisa que você tem que fazer é criar uma nova instância do
parser.
parser = sax.parser(strict);
O parser sozinho está trabalhando orientado a
eventos, como quase tudo no NodeJS. Quando você está usando um parser orientado
a eventos XML, é bastante útil usar um diagrama de estados – pois é mais fácil
compreender o tipo de nó que você está visitando atualmente.
Agora existem alguns ganchos pré-definidos que você pode usar para escutar
eventos como open tag, close tag etc…
parser.ontext = function(t) {
console.log('This is the text in that node: ' + t);
};
parser.onopentag = function(node) {
//on new tag opened
};
No final, a única coisa que você tem que fazer é iniciar o processo do
parser. Apenas leia o conteúdo do arquivo em um String buffer (chamado
file_buf) e então o coloque na biblioteca do parser.
try {
var file_buf = fs.readFileSync('./demistified.xml');
parser.write(file_buf.toString('utf8')).close();
} catch(ex) {
// keep 'em silent
}
Nos ganchos do evento, você pode começar a escrever sua própria estrutura
de dados, o NodeJS é construído para analisar e segurar muitos dados complexos.
No meu caso, eu tinha um arquivo de 20 MB de dados XML, e eu extraí 180 nós de
dados dessa imensa quantidade em apenas 2 segundos.
No final, se você precisar
que sua estrutura interna de dados (provavelmente você usará array e
combinações de objetos) seja salva em um arquivo, você pode facilmente utilizar
o comando:
fs.writeFileSync('test.json', JSON.stringify(DataNodeSpace));
Ele escreve o array DataNodeSpace no formato JSON no
arquivo test.json.
Para modificar, atravessar, adicionar propriedades a um array ou objeto no
JavaScript ou no NodeJS, é bastante fácil e rápido. Eu fiquei maravilhado com a
rapidez com que você pode construir um parser XML (10 linhas de código) e depois da
(mais ou menos complexos *g*) execução dos algoritmos de análise você pode
transformar os elementos de dados fácil e confortavelmente.
Espero que você tenha tido uma pequena visão geral sobre como analisar arquivos
XML no NodeJS.
?
Texto original disponível em http://blog.lagentz.com/nodejs/nodejs-parsing-and-transforming-large-xml-documents/