Форматирование XML-файла при сохранении DOM-представления
Q. MSXML сохраняет документы в “одну строку”. Как сделать вывод xml-файла в виде дерева с отступами?
А [Anton Lapounov]. Можно пройтись по дереву и вставить текстовые узлы с отступами с помощью следующей рекурсивной функции:
// Украсить XML-дерево вставкой отступов. (C) Anton Lapounov 2005
function Indent(node, curIndent, levelIndent)
{
// Если у узла нет содержимого, ничего не делать
if (!node.hasChildNodes)
{
return;
}
// Если содержимое включает текстовые узлы, ничего не делать
for (var child = node.firstChild; child != null; child = child.nextSibling)
{
if (child.nodeType == 3 || // PCDATA
child.nodeType == 4) // CDATA
{
break;
}
}
if (child != null)
{
return;
}
// Вставить текстовые узлы с отступами между дочерними узлами и обработать их рекурсивно
var newIndent = curIndent + levelIndent;
var textNode = node.ownerDocument.createNode(3, "", "");
textNode.text = newIndent;
for (child = node.firstChild; child != null; child = child.nextSibling)
{
node.insertBefore(textNode.cloneNode(false), child);
Indent(child, newIndent, levelIndent);
}
textNode.text = curIndent;
node.appendChild(textNode);
}
// Пример использования функции Indent:
// Загрузить XML-документ из файла input.xml
var doc = new ActiveXObject("MSXML2.DomDocument");
doc.async = false;
if (!doc.load("input.xml"))
{
WScript.Echo("ERROR: " + doc.parseError.reason);
WScript.Quit(1);
}
// Вставить отступы: перевод строки + 2 пробела на каждый уровень
Indent(doc.documentElement, "\n", " ");
// Показать документ с отступами
WScript.Echo(doc.xml);
// Сохранить документ с отступами в файл output.xml
doc.save("output.xml");