Backend half
This commit is contained in:
+102
@@ -0,0 +1,102 @@
|
||||
var util = require('../util');
|
||||
var XmlNode = require('./xml-node').XmlNode;
|
||||
var XmlText = require('./xml-text').XmlText;
|
||||
|
||||
function XmlBuilder() { }
|
||||
|
||||
XmlBuilder.prototype.toXML = function(params, shape, rootElement, noEmpty) {
|
||||
var xml = new XmlNode(rootElement);
|
||||
applyNamespaces(xml, shape, true);
|
||||
serialize(xml, params, shape);
|
||||
return xml.children.length > 0 || noEmpty ? xml.toString() : '';
|
||||
};
|
||||
|
||||
function serialize(xml, value, shape) {
|
||||
switch (shape.type) {
|
||||
case 'structure': return serializeStructure(xml, value, shape);
|
||||
case 'map': return serializeMap(xml, value, shape);
|
||||
case 'list': return serializeList(xml, value, shape);
|
||||
default: return serializeScalar(xml, value, shape);
|
||||
}
|
||||
}
|
||||
|
||||
function serializeStructure(xml, params, shape) {
|
||||
util.arrayEach(shape.memberNames, function(memberName) {
|
||||
var memberShape = shape.members[memberName];
|
||||
if (memberShape.location !== 'body') return;
|
||||
|
||||
var value = params[memberName];
|
||||
var name = memberShape.name;
|
||||
if (value !== undefined && value !== null) {
|
||||
if (memberShape.isXmlAttribute) {
|
||||
xml.addAttribute(name, value);
|
||||
} else if (memberShape.flattened) {
|
||||
serialize(xml, value, memberShape);
|
||||
} else {
|
||||
var element = new XmlNode(name);
|
||||
xml.addChildNode(element);
|
||||
applyNamespaces(element, memberShape);
|
||||
serialize(element, value, memberShape);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function serializeMap(xml, map, shape) {
|
||||
var xmlKey = shape.key.name || 'key';
|
||||
var xmlValue = shape.value.name || 'value';
|
||||
|
||||
util.each(map, function(key, value) {
|
||||
var entry = new XmlNode(shape.flattened ? shape.name : 'entry');
|
||||
xml.addChildNode(entry);
|
||||
|
||||
var entryKey = new XmlNode(xmlKey);
|
||||
var entryValue = new XmlNode(xmlValue);
|
||||
entry.addChildNode(entryKey);
|
||||
entry.addChildNode(entryValue);
|
||||
|
||||
serialize(entryKey, key, shape.key);
|
||||
serialize(entryValue, value, shape.value);
|
||||
});
|
||||
}
|
||||
|
||||
function serializeList(xml, list, shape) {
|
||||
if (shape.flattened) {
|
||||
util.arrayEach(list, function(value) {
|
||||
var name = shape.member.name || shape.name;
|
||||
var element = new XmlNode(name);
|
||||
xml.addChildNode(element);
|
||||
serialize(element, value, shape.member);
|
||||
});
|
||||
} else {
|
||||
util.arrayEach(list, function(value) {
|
||||
var name = shape.member.name || 'member';
|
||||
var element = new XmlNode(name);
|
||||
xml.addChildNode(element);
|
||||
serialize(element, value, shape.member);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function serializeScalar(xml, value, shape) {
|
||||
xml.addChildNode(
|
||||
new XmlText(shape.toWireFormat(value))
|
||||
);
|
||||
}
|
||||
|
||||
function applyNamespaces(xml, shape, isRoot) {
|
||||
var uri, prefix = 'xmlns';
|
||||
if (shape.xmlNamespaceUri) {
|
||||
uri = shape.xmlNamespaceUri;
|
||||
if (shape.xmlNamespacePrefix) prefix += ':' + shape.xmlNamespacePrefix;
|
||||
} else if (isRoot && shape.api.xmlNamespaceUri) {
|
||||
uri = shape.api.xmlNamespaceUri;
|
||||
}
|
||||
|
||||
if (uri) xml.addAttribute(prefix, uri);
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
*/
|
||||
module.exports = XmlBuilder;
|
||||
Reference in New Issue
Block a user