builder.js 2.9 KB

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