function formatXML_old(xml, tab) {
var formatted = '', indent= '';
tab = tab || '\t';
xml.split(/>\s*</).forEach(function(node) {
if (node.match( /^\/\w/ )) indent = indent.substring(tab.length);
formatted += indent + '<' + node + '>\r\n';
if (node.match( /^<?\w[^>]*[^\/]$/ )) indent += tab;
});
return formatted.substring(1, formatted.length-3);
}
function formatXML_new(xml, tab = '\t', nl = '\n') {
let formatted = '', indent = '';
const nodes = xml.slice(1, -1).split(/>\s*</);
if (nodes[0][0] == '?') formatted += '<' + nodes.shift() + '>' + nl;
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
if (node[0] == '/') indent = indent.slice(tab.length);
formatted += indent + '<' + node + '>' + nl;
if (node[0] != '/' && node[node.length - 1] != '/' && node.indexOf('</') == -1) indent += tab;
}
return formatted;
}
const demo_xml = `<?xml version='1.0' encoding='UTF-8'?><guestbook><guest><fname>Terje</fname><lname>Beck</lname></guest><guest><fname>Jan</fname><lname>Refsnes</lname></guest><guest><fname>Torleif</fname><lname>Rasmussen</lname></guest><guest><fname>anton</fname><lname>chek</lname></guest><guest><fname>stale</fname><lname>refsnes</lname></guest><guest><fname>hari</fname><lname>prawin</lname></guest><guest><fname>Hege</fname><lname>Refsnes</lname></guest></guestbook>`;