reader.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. var promises = require("../promises");
  2. var _ = require("underscore");
  3. var xmldom = require("./xmldom");
  4. var nodes = require("./nodes");
  5. var Element = nodes.Element;
  6. exports.readString = readString;
  7. var Node = xmldom.Node;
  8. function readString(xmlString, namespaceMap) {
  9. namespaceMap = namespaceMap || {};
  10. try {
  11. var document = xmldom.parseFromString(xmlString, "text/xml");
  12. } catch (error) {
  13. return promises.reject(error);
  14. }
  15. if (document.documentElement.tagName === "parsererror") {
  16. return promises.resolve(new Error(document.documentElement.textContent));
  17. }
  18. function convertNode(node) {
  19. switch (node.nodeType) {
  20. case Node.ELEMENT_NODE:
  21. return convertElement(node);
  22. case Node.TEXT_NODE:
  23. return nodes.text(node.nodeValue);
  24. }
  25. }
  26. function convertElement(element) {
  27. var convertedName = convertName(element);
  28. var convertedChildren = [];
  29. _.forEach(element.childNodes, function(childNode) {
  30. var convertedNode = convertNode(childNode);
  31. if (convertedNode) {
  32. convertedChildren.push(convertedNode);
  33. }
  34. });
  35. var convertedAttributes = {};
  36. _.forEach(element.attributes, function(attribute) {
  37. convertedAttributes[convertName(attribute)] = attribute.value;
  38. });
  39. return new Element(convertedName, convertedAttributes, convertedChildren);
  40. }
  41. function convertName(node) {
  42. if (node.namespaceURI) {
  43. var mappedPrefix = namespaceMap[node.namespaceURI];
  44. var prefix;
  45. if (mappedPrefix) {
  46. prefix = mappedPrefix + ":";
  47. } else {
  48. prefix = "{" + node.namespaceURI + "}";
  49. }
  50. return prefix + node.localName;
  51. } else {
  52. return node.localName;
  53. }
  54. }
  55. return promises.resolve(convertNode(document.documentElement));
  56. }