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?
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);
});
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.
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);
}
});
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>"
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.
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);
});
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);
});