10

モジュールxml2jsを使用して、node.jsでXMLをJSONに変換しようとしています。変数にアクセスするときに名前空間エイリアスを処理するにはどうすればよいですか?

次のコードは、私のファイル (sampleWithNamespaces.xml) を変換します。

var fs = require('fs'),
xml2js = require('xml2js');

var parser = new xml2js.Parser();
fs.readFile('sampleWithNamespaces.xml', function (err, data) {
    parser.parseString(data, function (err, result) {
        console.dir(result);
        console.log('Done');
    });
});

sampleWithNamespaces.xml :

<d:student xmlns:d='http://www.develop.com/student'>
  <d:id>3235329</d:id>
  <d:name>Jeff Smith</d:name>
  <d:language>JavaScript</d:language>
  <d:rating>9.5</d:rating>
</d:student>

出力:

$ node xml2jsTest.js
{ '@': { 'xmlns:d': 'http://www.develop.com/student' },
  'd:id': '3235329',
  'd:name': 'Jeff Smith',
  'd:language': 'JavaScript',
  'd:rating': '9.5' }
Done

名前空間エイリアスがない場合は、result['d:name']代わりに表記法を使用して 'name' 属性にアクセスできます。result.name私の質問は、これを正しい方法で行っているかということだと思います。

「要素に名前空間エイリアスがある場合、エイリアスと要素は「$」を使用して連結されます。たとえば、ns:element は ns$element になります」と読みました。これを行うと、属性を として読み取ることができますresult.d$name。もし私がこの道を進んだとしたら、どうやってそうすることができたでしょうか?

4

4 に答える 4

1

node と xml2js を使用result["ns:entry"]して特定のエントリを参照する場合

于 2013-10-21T11:58:44.957 に答える
0

引用するドキュメントは xml2js とは関係ありませんが、必要に応じて同じパターンを取得できます。xml2js のソース コードを変更するか、読み込み後にすべての名前を変更してループする必要がありますが、どちらも優れたアイデアではありません (1 つ目は、簡単に更新できず、コードにオーバーヘッドが追加されることを意味します)。 、したがって、おそらく ['d:name'] 構文に固執する必要があります。唯一の欠点は、各ルックアップに 3 文字追加されることですが、サーバーが gzip を使用している場合、実際には違いはありません。

あなたが本当にしたいのであれば、この関数はすべての名前を変更します:

function colonToDollar(obj){
    var r={};
    for(var k in obj){
        r[k.replace(/:/g,'$')] = (typeof obj[k]==='object') ? colonToDollar(obj[k]) : obj[k];
    }
    return r;
}
于 2013-03-03T19:40:37.023 に答える