newParse = {
function convertString(value) {
const numValue = parseFloat(value);
if (!isNaN(numValue)) {
return numValue;
}
if (value.toLowerCase() === "true") {
return true;
} else if (value.toLowerCase() === "false") {
return false;
}
return value;
}
function xmlToJson(xmlNode) {
if (xmlNode.nodeType === 3) {
return convertString(xmlNode.nodeValue.trim());
}
if (
xmlNode.childNodes.length === 0 &&
(!xmlNode.attributes || xmlNode.attributes.length === 0)
) {
return "";
}
let jsonObj = {};
if (xmlNode.attributes && xmlNode.attributes.length > 0) {
let attrsObj = {};
for (let i = 0; i < xmlNode.attributes.length; i++) {
const attr = xmlNode.attributes[i];
attrsObj[attr.name] = convertString(attr.value);
}
jsonObj["attr"] = attrsObj;
}
for (let i = 0; i < xmlNode.childNodes.length; i++) {
const childNode = xmlNode.childNodes[i];
const childJson = xmlToJson(childNode);
if (childJson !== undefined && childJson !== "") {
if (childNode.nodeName === "#text" && xmlNode.childNodes.length === 1) {
return childJson;
}
if (jsonObj[childNode.nodeName]) {
if (!Array.isArray(jsonObj[childNode.nodeName])) {
jsonObj[childNode.nodeName] = [jsonObj[childNode.nodeName]];
}
jsonObj[childNode.nodeName].push(childJson);
} else {
jsonObj[childNode.nodeName] = childJson;
}
}
}
return jsonObj;
}
function parse(xmlStr) {
const parser = new DOMParser();
const doc = parser.parseFromString(xmlStr, "application/xml");
return { OME: xmlToJson(doc.documentElement) };
}
return parse;
}