最近在做微信公眾號程序腾啥,微信服務器在向開發(fā)者的服務器post數據采用的是xml格式,如何優(yōu)雅高效將XML數據轉換為JS Object數據冯吓。
xml2js 庫
一種比較常見的將XML 數據與JS object 相互轉換的第三方類庫倘待,轉換后JS object 的value是一個數組。
var xmlUtil = require('../xmlUtil')
var xmlData = "<xml><ToUserName><Name1>Spursyy</Name1> <Name2>YY</Name2></ToUserName><FromUserName><![CDATA[WeiChat]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event></xml>"
xmlUtil.parseXMLAsync(xmlData).then(function(data) {
console.log(data)
}).catch(function(err) {
console.log(err)
})
上述程序輸出的結果是:
{ xml:
{ ToUserName: [ [Object] ],
FromUserName: [ 'WeiChat' ],
CreateTime: [ '123456789' ],
MsgType: [ 'event' ],
Event: [ 'subscribe' ] } }
由于轉換后的value是數組组贺,這在調用JS object 的value時會存在很大不便凸舵,如何value的值時Object,也會存在很多問題失尖。
自定義xmlUtil
實現(xiàn)XML 數據向JS Object的轉換
第一步 用bluebird 封裝 xml2js.parseString
var promise = require('bluebird')
exports.parseXMLAsync = function(xml) {
return new Promise(function(resolve, reject) {
xml2js.parseString(xml, {trim: true}, function(err, content) {
if (err) reject(err)
else resolve(content)
})
})
}
第二步 解析上一步的數據贞间,解析key對應object并賦值給value
function formatMessage(result) {
var message = {};
if (typeof result === 'object') {
var keys = Object.keys(result)
console.log(keys)
for (var i = 0; i < keys.length; i++) {
var item = result[keys[i]]
var key = keys[i];
if ((!(item instanceof Array ) || item.length === 0) ) {
continue;
}
if (item.length === 1) {
var val = item[0]
if (typeof val === 'object') {
message[key] = formatMessage(val)
}
else {
message[key] = (val || '')
}
} else {
message[key] = []
for (var j = 0, k = item.length; j < k; j++) {
message[key].push(formatMessage(item[j]))
}
}
}
} else {
return result;
}
return message
}
解析key對應object,存在兩種情況:
- 如果object類型是Object對象
- 如果object類型是Array對象
3 如果使用xmlUtil 工具類庫
由于解析xml數據并不會阻塞線程,因此要特別注意:
//Promise + Async function
var xmlUtil = require('../xmlUtil/xmlUtil')
xmlUtil.parseXMLAsync(xml2).then(function(data) {
console.log(data)
(async function() {
var mes = await xmlUtil.formatMessage(data.xml)
console.log(mes)
})()
}).catch(function(err) {
console.log(err)
})
// Async + Async function
var xmlUtil = require('../xmlUtil/xmlUtil')
async function getValue() {
var content = await xmlUtil.parseXMLAsync(xml2)
console.log(content)
var mes = await xmlUtil.formatMessage(content.xml)
await console.log(mes);
}
getValue().catch(function(err) {
console.log(err)
})