Как растабулировать xml-документ

Стандартный

Если создавать 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

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s