web-dev-qa-db-ja.com

Node.jsでXMLファイルを読み取る

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 app。にロードしようとしています。ロードすると、<article:要素の使用を含むurl要素のみを取得したいです。現時点では、行き詰まっていますが、現在、次の方法で 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, ...]}

私は何が欠けていますか?

19
user70192

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);
 });
21

ドキュメント から。

コールバックには2つの引数(err、data)が渡されます。dataはファイルの内容です。

エンコーディングが指定されていない場合、生のバッファが返されます。

Optionsが文字列の場合、エンコードを指定します。例:

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

エンコードを指定しなかったため、生のバッファを取得します。

10
Quentin

fs.readFileには、オプションの2番目のパラメーターであるencodingがあります。このパラメーターを含めない場合、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);
    }
});
2
Nate

解析する前に正規表現を使用して、条件に一致しない要素を削除することもできます。

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>"
1
Daphoque

なぜlibxmljsパッケージに言及していないのですか?私はそれについて読んだだけで、それを使用してxmlを解析するのは非常に簡単に思えました。

1
Abhay Maniyar

これを試すことができます

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);
});
1
Atul Kr Dey

NodeでXMLファイルを読み取る には、 XML2JSパッケージ が好きです。このパッケージを使用すると、JavaScriptでXMLを簡単に操作できます。

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

このスレッドに遅れて、ここで簡単なヒントを1つ追加するだけです。jsで解析済みデータを使用するかjsonファイルとして保存する場合は、必ずexplicitArrayfalseに設定してください。出力はよりjsフレンドリーになります

のようになります、
letparser=newxml2js.Parser({explicitArray:false})

参照: https://github.com/Leonidas-from-XIV/node-xml2js

0
KuN