70 lines
1.9 KiB
JavaScript
70 lines
1.9 KiB
JavaScript
var promises = require("../promises");
|
|
var _ = require("underscore");
|
|
|
|
var xmldom = require("./xmldom");
|
|
var nodes = require("./nodes");
|
|
var Element = nodes.Element;
|
|
|
|
exports.readString = readString;
|
|
|
|
var Node = xmldom.Node;
|
|
|
|
function readString(xmlString, namespaceMap) {
|
|
namespaceMap = namespaceMap || {};
|
|
|
|
try {
|
|
var document = xmldom.parseFromString(xmlString, "text/xml");
|
|
} catch (error) {
|
|
return promises.reject(error);
|
|
}
|
|
|
|
if (document.documentElement.tagName === "parsererror") {
|
|
return promises.resolve(new Error(document.documentElement.textContent));
|
|
}
|
|
|
|
function convertNode(node) {
|
|
switch (node.nodeType) {
|
|
case Node.ELEMENT_NODE:
|
|
return convertElement(node);
|
|
case Node.TEXT_NODE:
|
|
return nodes.text(node.nodeValue);
|
|
}
|
|
}
|
|
|
|
function convertElement(element) {
|
|
var convertedName = convertName(element);
|
|
|
|
var convertedChildren = [];
|
|
_.forEach(element.childNodes, function(childNode) {
|
|
var convertedNode = convertNode(childNode);
|
|
if (convertedNode) {
|
|
convertedChildren.push(convertedNode);
|
|
}
|
|
});
|
|
|
|
var convertedAttributes = {};
|
|
_.forEach(element.attributes, function(attribute) {
|
|
convertedAttributes[convertName(attribute)] = attribute.value;
|
|
});
|
|
|
|
return new Element(convertedName, convertedAttributes, convertedChildren);
|
|
}
|
|
|
|
function convertName(node) {
|
|
if (node.namespaceURI) {
|
|
var mappedPrefix = namespaceMap[node.namespaceURI];
|
|
var prefix;
|
|
if (mappedPrefix) {
|
|
prefix = mappedPrefix + ":";
|
|
} else {
|
|
prefix = "{" + node.namespaceURI + "}";
|
|
}
|
|
return prefix + node.localName;
|
|
} else {
|
|
return node.localName;
|
|
}
|
|
}
|
|
|
|
return promises.resolve(convertNode(document.documentElement));
|
|
}
|