XML到JSON – 处理JavaScript中的xml命名空间和别名

我正在尝试使用模块xml2js在node.js中将XML转换为JSON。 如何在访问variables时处理命名空间别名?

下面的代码将我的文件(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'属性。 我想我的问题是,我是这样做的吗?

我读过 “如果一个元素有一个名称空间别名,别名和元素连接使用”$“。例如,ns:元素成为ns $元素”如果我这样做,我可以读取属性作为result.d$name 。 如果我走了这条路,我怎么会这样做呢?

我有一个类似的问题。 我的大部分XML标签都位于一个名称空间中。 所以我决定从我的XML中删除所有的命名空间。

通过向xml2js添加tagNameProcessors来parsingXML时,可以去掉名称空间。

 var parseString = require('xml2js').parseString; var stripNS = require('xml2js').processors.stripPrefix; parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {}); 

这在技术上会忽略所有的命名空间。 如果您有来自多个名称空间的XML标记,那么这可能不是很有用。

您引用的文档与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; } 

如果使用node和xml2js,则使用result["ns:entry"]来引用特定条目