2015-09-30 35 views
5

Nodeの使い方を学んでいます。私は私のノードのアプリでこのXMLをロードしようとしていますNode.jsで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> 

sitemap.xmlと:この時、私はこのようなXMLファイルを持っています。ロードされると、要素の使用を含む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, ...]} 

何が欠けていますか?

答えて

4

からthe documentation

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

エンコードが指定されていない場合は、ローバッファが返されます。

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

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

あなたはエンコーディングを指定していないので、あなたは、生のバッファを取得します。

1

fs.readFileにはオプションの第2パラメータencodingがあります。このパラメータを指定しないと、自動的にBufferオブジェクトが返されます。

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

あなただけの使用エンコーディングを知っている場合:

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

read an XML file in Nodeするために、私はXML2JS packageが好き。このパッケージを使用すると、JavaScriptで簡単にXMLを操作できます。

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

このモジュールはあまりにも限られている...イベント、ネストされたノードを扱うことができません、順序にかかわらず同じタグを持つノードを配列に返します... WTF? – TacB0sS

0

あなたはJSで解析されたデータを使用するか、またはJSONファイルとして保存し、falseexplicitArrayを設定してくださいすることを計画している場合だけ、 をここ1つの、簡単なヒントを追加するために、このスレッドに遅れてきます。出力は、より多くのJSフレンドリーになりますので

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

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

6

使用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); 
 
});

+0

XMLからJSONへの変換を見ている人にとっては、小さなヘッドアップ:xml2jsonライブラリは、xml2jsではなく私の方がはるかに優れています。 – Imperator

0

なぜ誰も言及していないlibxmljsパッケージ?私はちょうどそれについて読んで、それは私にそれを使用してXMLを解析するのは非常に簡単だった。

あなたはまた、あなたの条件に一致しない要素を削除するために解析する前に正規表現を使用することができます
0

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