我正在尝试使用模块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']
代替result.name
来访问'name'属性。我想我的问题是,我这样做是正确的吗?
我read表示“如果一个元素具有命名空间别名,则别名和元素使用”$“连接。例如,ns:element变为ns $ element”如果我这样做,我可以阅读属性为result.d$name
。如果我走这条路,我怎么会这样做?
答案 0 :(得分:4)
我有类似的问题。我的大多数XML标签都在一个命名空间中。所以我决定从我的XML中删除所有命名空间。
通过将tagNameProcessors添加到xml2js
,可以在解析XML时删除命名空间。
var parseString = require('xml2js').parseString;
var stripNS = require('xml2js').processors.stripPrefix;
parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {});
这在技术上会忽略所有命名空间。如果您有来自多个名称空间的XML标记,那么这可能没什么用处。
答案 1 :(得分:0)
您引用的文档与xml2js无关,但如果需要,您可以获得相同的模式。您必须更改xml2js的源代码或在加载后重命名所有内容,这两个都不是很好的想法(第一个意味着您将无法轻松更新,并且都会增加代码的开销) ,所以你应该坚持['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;
}
答案 2 :(得分:0)
如果您使用node而xml2js使用result["ns:entry"]
来引用特定条目
答案 3 :(得分:0)
对于那些使用打字稿的人
import { Parser, processors } from 'xml2js';
const parser = new Parser(
{
trim: true,
explicitArray: false,
tagNameProcessors: [processors.stripPrefix]
});
parser.parseString(xmlData, function(err, result)
{