Чтение XML файла в Node.js
Я изучаю, как использовать Node. В это время у меня есть XML файл, который выглядит так:
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>
Я пытаюсь загрузить этот XML в моем приложении Node. При загрузке я хочу получить только те элементы url
, которые включают в себя использование элементов <article:
. В это время я застрял. Прямо сейчас я использую XML2JS через следующее:
var parser = new xml2js.Parser();
fs.readFile(__dirname + '/../public/sitemap.xml', function(err, data) {
if (!err) {
console.log(JSON.stringify(data));
}
});
Когда выполняется оператор console.log
, я просто вижу кучу чисел в окне консоли. Что-то вроде этого:
{"type":"Buffer","data":[60,63,120, ...]}
Что мне не хватает?
Ответы
Ответ 1
использовать 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);
});
Ответ 2
Из документации.
Обратному вызову передаются два аргумента (err, data), где data - это содержимое файла.
Если кодировка не указана, возвращается необработанный буфер.
Если options - это строка, то она указывает кодировку. Пример:
fs.readFile('/etc/passwd', 'utf8', callback);
Вы не указали кодировку, поэтому вы получаете необработанный буфер.
Ответ 3
fs.readFile имеет необязательный второй параметр: кодировка. Если вы не включите этот параметр, он автоматически вернет вам объект Buffer.
https://nodejs.org/api/fs.html#fs_fs_readfile_filename_options_callback
Если вы знаете кодировку, просто используйте:
fs.readFile(__dirname + '/../public/sitemap.xml', 'utf8', function(err, data) {
if (!err) {
console.log(data);
}
});
Ответ 4
Вы можете попробовать это
npm install express-xml-bodyparser --save
на стороне клиента: -
$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;
});
};
на стороне сервера: -
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);
});
Ответ 5
Вы также можете использовать регулярное выражение перед разбором, чтобы удалить элементы, не соответствующие вашим условиям:
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 ...
});
Пример:
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>"
Ответ 6
Чтобы прочитать XML файл в Node, мне нравится Пакет XML2JS. Этот пакет позволяет мне легко работать с XML в JavaScript.
var parser = new xml2js.Parser();
parser.parseString(fileData.substring(0, fileData.length), function (err, result) {
var json = JSON.stringify(result);
});
Ответ 7
опаздывающий на эту тему, просто добавьте один простой совет здесь,
если вы планируете использовать проанализированные данные в js или сохранить его как json файл, обязательно установите explicitArray
в false
. Выход будет более дружественным js
так что это будет выглядеть,
letparser=newxml2js.Parser({explicitArray:false})
Ref:
https://github.com/Leonidas-from-XIV/node-xml2js
Ответ 8
Почему никто не упомянул пакет libxmljs
? Я просто прочитал об этом, и мне показалось довольно легко разобрать xml, используя его для меня.