Если создавать xml-документ с помощью Microsoft.XMLDOM, то в текстовом виде файл этот почему-то записывается в одну строку. Вобщем-то, если работать с файлом программно или смотреть его с помощью, например, Internet Explorer, то проблем не возникает. Но вот просматривать/редактировать такой файл с помощью текстового редактора страшно неудобно, особенно если хочется быстро поменять какой-то параметр в файле на стенде, где не стоит никаких специальных тулов. Следущая функция на VBScript умеет делать из однострочного xml-документа нормальный, со всеми нужными отступами.
'strFileName - имя файла, который нужно "растабулировать"
Sub TabDocument (strFileName)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim objFSO, objFile, strSource, blnEnd, intStart, intStartPosition, intTabCount, intTabPosition
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'открываем xml-файл как текстовый
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strSource = ""
'Считываем файл
While Not objFile.AtEndOfStream
strSource = strSource & objFile.Read(1)
Wend
objFile.Close
'Создаем файл с тем же именем, но уже для записи (старый файл при этом заменяется новым)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
blnEnd = False
'Текущая позиция в файле, откуда начинается поиск очередного места для табуляции
intStart = 1
'Текущий отступ (количество табуляций)
intTabCount = 0
'Место в строке, куда нужно вставить табуляцию
intTabPosition = 1
While Not blnEnd
'Находим место, где открывается очередной тег (т.е. куда нужно будет вставить табуляцию)
intStartPosition = InStr(intStart, strSource, "><")
'Если открытых тегов не осталось, выходим из цикла
If intStartPosition = 0 Then
blnEnd = True
Else
'Находим место очередного закрывающего тега (проверям пустые узлы вида <node></node>)
intTabPosition = InStr(intStart, strSource, "></")
'Если этот закрывающий тег парный для текущего открытого тега, уменьшаем число табуляций
If intTabPosition <= intStartPosition Then intTabCount = intTabCount - 1
'Находим место очередного закрывающего тега (проверям пустые узлы вида <node>Some text</node>)
intTabPosition = InStr(intStart, strSource, "</")
'Если этот закрывающий тег парный для текущего открытого тега, уменьшаем число табуляций
If intTabPosition <= intStartPosition Then intTabCount = intTabCount - 1
'Находим место очередного закрывающего тега (проверям пустые узлы вида <node/>)
intTabPosition = InStr(intStart, strSource, "/>")
'Если этот закрывающий тег парный для текущего открытого тега, уменьшаем число табуляций
If intTabPosition <= intStartPosition Then intTabCount = intTabCount - 1
If intTabCount < 0 Then intTabCount = 0
'Вставляем нужное количество табуляций
'Функция String возвращает количество символов vbTab равное intTabCount
'Функция Replace делает только одну замену
strSource = Replace(strSource, "><", ">" & vbNewLine & String(intTabCount, vbTab) & "<", 1, 1)
intStart = intStartPosition + 1
intTabCount = intTabCount + 1
End If
Wend
'Записываем растабулированный текст в файл
objFile.Write strSource
objFile.Close
End Sub

