XML到JSON - 在JavaScript中处理xml名称空间和别名

Tra*_*son 9 javascript json xml-namespaces node.js xml-parsing

我正在尝试使用模块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');
    });
});
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

我可以使用符号result['d:name']来访问'name'属性,而不是result.name如果我没有命名空间别名.我想我的问题是,我这样做是正确的吗?

读过 "如果一个元素有一个名称空间别名,别名和元素是用"$"连接的.例如,ns:元素变为ns $元素"如果我这样做,我可以读取属性为result.d$name.如果我走这条路,我怎么会这样做?

pra*_*ann 5

我有一个类似的问题。我的大多数XML标签都在单个命名空间中。因此,我决定从XML中删除所有命名空间。

通过将tagNameProcessors添加到,可以在解析XML时剥离名称空间xml2js

var parseString = require('xml2js').parseString;
var stripNS = require('xml2js').processors.stripPrefix;

parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {});
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这将忽略所有名称空间。如果您有来自多个名称空间的XML标记,那么这可能就没有多大用处了。


Dav*_*ave 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;
}
Run Code Online (Sandbox Code Playgroud)