json_xml
Version:
1.xml to json; 2.json to xml; 3.express middleware
85 lines (70 loc) • 2.23 kB
JavaScript
exports.json2xml = function (jsonObj) {
if (typeof (jsonObj) == 'number') {
return jsonObj
}
if (typeof (jsonObj) == 'string') {
return '<![CDATA[' + jsonObj + ']]>'
}
var xmlstr = ''
for (var key in jsonObj) {
if (jsonObj[key] instanceof Array) {
jsonObj[key].forEach((element) => {
xmlstr += '<' + key + '>'
xmlstr += arguments.callee(element)
xmlstr += '</' + key + '>'
})
continue
}
xmlstr += '<' + key + '>'
xmlstr += arguments.callee(jsonObj[key])
xmlstr += '</' + key + '>'
}
return xmlstr
}
exports.xml2json = function (xmlStr) {
xmlStr = xmlStr.replace(/^\s*<\?xml[\S\s]*?\?>/, '')
var obj = {}
while (/<([^>\s]+)[\S\s]*?>/.test(xmlStr)) {
var tagName = RegExp.$1
if (/\s*\/\s*>$/.test(RegExp['$&'])) {
xmlStr = xmlStr.replace(RegExp['$&'], '')
obj[tagName] = ''
continue
}
if (/!\[CDATA\[([\S\s]*?)\]\]/.test(xmlStr)) {
xmlStr = xmlStr.replace(/<!\[CDATA\[([\S\s]*?)\]\]>/, '$1')
continue
}
var regex = '<' + tagName + '[\\S\\s]*?>([\\S\\s]*?)<\\/' + tagName + '>'
regex = new RegExp(regex)
xmlStr = xmlStr.replace(regex, '')
var subNode = arguments.callee(RegExp.$1)
if (typeof (obj[tagName]) != 'undefined') {
if (obj[tagName] instanceof Array) {
obj[tagName].push(subNode)
continue
}
obj[tagName] = [obj[tagName], subNode]
continue
}
obj[tagName] = subNode
}
if (!Object.getOwnPropertyNames(obj).length) {
return xmlStr
}
return obj
}
exports.middleware = (req, res, next) => {
if (req._body) return next()
if (req.method == 'GET' || req.method == 'HEAD') return next()
if (!req.is('text/xml')) return next()
req._body = true
req.rawBody = ''
req.on('data', function (chunk) {
req.rawBody += chunk;
})
req.on('end', function () {
req.body = exports.xml2json(req.rawBody)
next()
})
}