2012-06-29 81 views
6

我正在嘗試使用模塊xml2js將XML轉換爲node.js中的JSON。如何在訪問變量時處理命名空間別名?XML to JSON - 處理JavaScript中的xml名稱空間和別名

後續的代碼轉換我的文件(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 

我可以訪問 'name' 屬性通過使用符號result['d:name']而不是result.name如果我沒有t他命名空間別名。我想我的問題是,我是否以正確的方式做這件事? 「如果一個元素有一個名稱空間別名,別名和元素使用」$「連接,例如,ns:元素變成ns $元素」如果我這樣做,我可以讀取屬性爲result.d$name。如果我走了這條路,我會怎麼做呢?

回答

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; 
} 
0

如果使用節點,並xml2js使用result["ns:entry"]指一個特定條目

2

我有一個類似的問題。我的大部分XML標籤都位於一個名稱空間中。所以我決定從我的XML中去掉所有的命名空間。

在解析XML時,可以通過向xml2js添加tagNameProcessors來去除名稱空間。

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

parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {}); 

這將在技術上忽略所有的命名空間。如果您有來自多個名稱空間的XML標籤,那麼這可能不是很有用。