builder.js (2573B)
1 var util = require('../util'); 2 var builder = require('xmlbuilder'); 3 4 function XmlBuilder() { } 5 6 XmlBuilder.prototype.toXML = function(params, shape, rootElement, noEmpty) { 7 var xml = builder.create(rootElement); 8 applyNamespaces(xml, shape); 9 serialize(xml, params, shape); 10 return xml.children.length > 0 || noEmpty ? xml.root().toString() : ''; 11 }; 12 13 function serialize(xml, value, shape) { 14 switch (shape.type) { 15 case 'structure': return serializeStructure(xml, value, shape); 16 case 'map': return serializeMap(xml, value, shape); 17 case 'list': return serializeList(xml, value, shape); 18 default: return serializeScalar(xml, value, shape); 19 } 20 } 21 22 function serializeStructure(xml, params, shape) { 23 util.arrayEach(shape.memberNames, function(memberName) { 24 var memberShape = shape.members[memberName]; 25 if (memberShape.location !== 'body') return; 26 27 var value = params[memberName]; 28 var name = memberShape.name; 29 if (value !== undefined && value !== null) { 30 if (memberShape.isXmlAttribute) { 31 xml.att(name, value); 32 } else if (memberShape.flattened) { 33 serialize(xml, value, memberShape); 34 } else { 35 var element = xml.ele(name); 36 applyNamespaces(element, memberShape); 37 serialize(element, value, memberShape); 38 } 39 } 40 }); 41 } 42 43 function serializeMap(xml, map, shape) { 44 var xmlKey = shape.key.name || 'key'; 45 var xmlValue = shape.value.name || 'value'; 46 47 util.each(map, function(key, value) { 48 var entry = xml.ele(shape.flattened ? shape.name : 'entry'); 49 serialize(entry.ele(xmlKey), key, shape.key); 50 serialize(entry.ele(xmlValue), value, shape.value); 51 }); 52 } 53 54 function serializeList(xml, list, shape) { 55 if (shape.flattened) { 56 util.arrayEach(list, function(value) { 57 var name = shape.member.name || shape.name; 58 var element = xml.ele(name); 59 serialize(element, value, shape.member); 60 }); 61 } else { 62 util.arrayEach(list, function(value) { 63 var name = shape.member.name || 'member'; 64 var element = xml.ele(name); 65 serialize(element, value, shape.member); 66 }); 67 } 68 } 69 70 function serializeScalar(xml, value, shape) { 71 xml.txt(shape.toWireFormat(value)); 72 } 73 74 function applyNamespaces(xml, shape) { 75 var uri, prefix = 'xmlns'; 76 if (shape.xmlNamespaceUri) { 77 uri = shape.xmlNamespaceUri; 78 if (shape.xmlNamespacePrefix) prefix += ':' + shape.xmlNamespacePrefix; 79 } else if (xml.isRoot && shape.api.xmlNamespaceUri) { 80 uri = shape.api.xmlNamespaceUri; 81 } 82 83 if (uri) xml.att(prefix, uri); 84 } 85 86 module.exports = XmlBuilder;