4
votes

Analyse du fichier XML dans Node.js

J'utilise un système Arch Linux avec KDE plasma. J'ai environ 50 Mo de XML et je dois l'analyser. Le fichier a des balises personnalisées.

Exemple de XML:

const fs = require('fs-extra');
const xml2js = require('xml2js');
const parser = new xml2js.Parser();

const path = "test.xml";

fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
     parser.parseString(data, function(err, res) {
         console.log(res);
     });
});

Result: Undefined

J'ai essayé de nombreuses solutions suggérées sur Stack Overflow, et elles ne fonctionnaient pas du tout, et certaines d'entre elles n'ont pas pu être installées sur mon système comme xml-stream , xml2json . J'ai décidé d'utiliser xml2js (la plupart suggèrent d'utiliser xml2js ), et j'ai obtenu le même résultat. Comment puis-je l'utiliser correctement? J'utilise ce code mais il renvoie toujours undefined:

<JMdict>
   <entry>
      <ent_seq>1000000</ent_seq>
      <r_ele>
         <reb>ヽ</reb>
      </r_ele>
      <sense>
         <pos>&unc;</pos>
         <gloss g_type="expl">repetition mark in katakana</gloss>
      </sense>
   </entry>
</JMdict>

Existe-t-il un moyen de gérer un fichier XML à la main (sans package)?

p >


1 commentaires

Votre fichier "XML" n'est pas bien formé: il contient une référence d'entité non définie & unc; . Ainsi l'analyse devrait échouer.


3 Réponses :


1
votes

La façon dont vous utilisez le package xml2js devrait être correcte. Cependant, le format de votre xml est un peu différent.

si vous ajoutez un console.log pour voir ce qui cause l'erreur

fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
     parser.parseString(data, function(err, res) {
         if (err) console.log(err);

         console.log(res);
     });
});

Vous verrez que c'est la ligne &unc; qui cause le problème. Si vous corrigez les entités HTML, l'analyseur devrait fonctionner correctement.


0 commentaires

4
votes

La réponse est ci-dessous Exemple de lien de travail

<pos>&unc;</pos>

Exact you doivent le faire ci-dessous:

data.replace (/ & (?! (?: apos | quot | [gl] t | amp); | #) / g, '&')

Le problème se situe en dessous de la balise uniquement &unc;

var fs = require('fs'),
slash = require('slash'),
xml2js = require('xml2js');

var parser = new xml2js.Parser();

let filename = slash(__dirname+'/foo.xml');

// console.log(filename);

fs.readFile(filename,  "utf8", function(err, data) {

    if(err) {
        console.log('Err1111');
        console.log(err);
    } else {
        //console.log(data);
        // data.toString('ascii', 0, data.length)

        parser.parseString(data.replace(/&(?!(?:apos|quot|[gl]t|amp);|#)/g, '&amp;'), function (err, result) {
            if(err) {
                console.log('Err');
                console.log(err);
            } else {
                console.log(JSON.stringify(result));
                console.log('Done');
            }            
        });
    }
});

Référencé et merci à @tim


0 commentaires

2
votes

Je pense que votre problème concerne les caractères non échappés dans vos données xml.

Je peux faire fonctionner votre exemple en utilisant ceci:

données xml:

const fs = require('fs-extra');
const xml2js = require('xml2js');
const parser = new xml2js.Parser();

const path = "test.xml";

fs.readFile(path, {encoding: 'utf-8'}, function(error, data) {
     parser.parseString(data, function(err, res) {
         console.log(JSON.stringify(res.JMdict.entry, null, 4));
     });

});

code node.js:

<JMdict>
    <entry>
        <ent_seq>1000000</ent_seq>
        <r_ele>
            <reb>ヽ</reb>
        </r_ele>
        <sense>
             <pos>YOUR PROBLEM WAS HERE</pos>
             <gloss g_type="expl">repetition mark in katakana</gloss>
        </sense>
    </entry>

Dans des situations comme celle-ci, quand je sais que cela devrait fonctionner correctement, je regarde toujours au niveau des données et pour d'éventuels problèmes avec les données d'entrée.


0 commentaires