web-dev-qa-db-fra.com

Lecture du fichier XML dans Node.js

J'apprends à utiliser Node. À ce stade, j'ai un fichier XML qui ressemble à ceci:

sitemap.xml

<?xml version="1.0" encoding="utf-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
  <url>
    <loc>http://www.example.com</loc>
    <lastmod>2015-10-01</lastmod>
    <changefreq>monthly</changefreq>
  </url>

  <url>
    <loc>http://www.example.com/about</loc>
    <lastmod>2015-10-01</lastmod>
    <changefreq>never</changefreq>
  </url>

  <url>
    <loc>http://www.example.com/articles/tips-and-tricks</loc>
    <lastmod>2015-10-01</lastmod>
    <changefreq>never</changefreq>
    <article:title>Tips and Tricks</blog:title>
    <article:description>Learn some of the tips-and-tricks of the trade</article:description>
  </url>
</urlset>

J'essaie de charger ce XML dans mon application Node. Une fois chargé, je veux uniquement obtenir les éléments url qui incluent l'utilisation des éléments <article:. À ce moment, je suis bloqué cependant. En ce moment, j'utilise XML2JS via ce qui suit:

var parser = new xml2js.Parser();
fs.readFile(__dirname + '/../public/sitemap.xml', function(err, data) {
    if (!err) {
        console.log(JSON.stringify(data));
    }
});

Lorsque l'instruction console.log est exécutée, je ne vois qu'un tas de nombres dans la fenêtre de la console. Quelque chose comme ça:

{"type":"Buffer","data":[60,63,120, ...]}

Qu'est-ce que je rate?

12
user70192

utiliser xml2json

https://www.npmjs.com/package/xml2json

fs = require('fs');
var parser = require('xml2json');

fs.readFile( './data.xml', function(err, data) {
    var json = parser.toJson(data);
    console.log("to json ->", json);
 });

16
Sajith Mantharath

De la documentation .

Le rappel reçoit deux arguments (err, data), où data est le contenu du fichier.

Si aucun codage n'est spécifié, le tampon brut est renvoyé.

Si options est une chaîne, il spécifie le codage. Exemple:

fs.readFile('/etc/passwd', 'utf8', callback);

Vous n'avez pas spécifié d'encodage, vous obtenez donc le tampon brut.

9
Quentin

fs.readFile a un deuxième paramètre facultatif: l'encodage. Si vous n'incluez pas ce paramètre, un objet Buffer vous sera automatiquement renvoyé.

https://nodejs.org/api/fs.html#fs_fs_readfile_filename_options_callback

Si vous connaissez le codage, utilisez simplement:

var parser = new xml2js.Parser();
fs.readFile(__dirname + '/../public/sitemap.xml', 'utf8', function(err, data) {
    if (!err) {
        console.log(data);
    }
});
2
Nate

Vous pouvez également utiliser regex avant l'analyse pour supprimer les éléments ne correspondant pas à vos conditions:

var parser = new xml2js.Parser();
fs.readFile(__dirname + '/../public/sitemap.xml', "utf8",function(err, data) {
    // handle err...

    var re = new RegExp("<url>(?:(?!<article)[\\s\\S])*</url>", "gmi")
    data = data.replace(re, ""); // remove node not containing article node
    console.log(data);
    //... parse data ...



});

Exemple :

   var str = "<data><url><hello>abc</hello><moto>abc</moto></url><url><hello>bcd</hello></url><url><hello>efd</hello><moto>poi</moto></url></data>";
   var re = new RegExp("<url>(?:(?!<moto>)[\\s\\S])*</url>", "gmi")
   str = str.replace(re, "")

   // "<data><url><hello>abc</hello><moto>abc</moto></url><url><hello>efd</hello><moto>poi</moto></url></data>"
1
Daphoque

Pourquoi personne n'a mentionné le paquet libxmljs? Je viens de lire à ce sujet et il semblait assez facile d'analyser XML en l'utilisant pour moi.

1
Abhay Maniyar

Afin de lire un fichier XML dans Node , j'aime bien le paquet XML2JS . Ce paquet me permet alors de travailler facilement avec le XML en JavaScript.

var parser = new xml2js.Parser();       
parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
  var json = JSON.stringify(result);
});
0
Chad Campbell

Tu peux essayer ça 

npm install express-xml-bodyparser --save

chez le client: -

 $scope.getResp = function(){
     var posting = $http({
           method: 'POST',
           dataType: 'XML',
           url: '/getResp/'+$scope.user.BindData,//other bind variable
           data: $scope.project.XmlData,//xmlData passed by user
           headers: {
              "Content-Type" :'application/xml'
            },
           processData: true
           });
       posting.success(function(response){
       $scope.resp1 =  response;
       });
   };

côté serveur: -

xmlparser = require('express-xml-bodyparser');
app.use(xmlparser());
app.post('/getResp/:BindData', function(req, res,next){
  var tid=req.params.BindData;
  var reqs=req.rawBody;
  console.log('Your XML '+reqs);
});
0
Atul Kr Dey