Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: [решено] парсинг xml :)
Показать сообщение отдельно

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


firstarey, если вас всё ещё интересует вариант на cmd, вот он:
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion
:: Inquisitor, 2014
:: Ad majorem Applejack gloriam

:: Файл для обработки
Set XMLFile=fff.xml
:: Ключевое слово по которому ищем строки с номерами точек
Set KeyWord=Su_Nmb
:: Смещение координат в строках от номера точки
Set Shift=1
:: Файл для вывода результата обработки
Set Result=output.csv

:: Создаем (или перезаписываем) файл с результатом
Echo.>"%Result%"
:: Читаем документ поблочно
For /F "usebackq eol= tokens=* delims=" %%A In ("%XMLFile%") Do (
	Set "Data=%%A"
:: Работа с содержимым блока
	If "!Block!"=="true" If "!Data:~,8!"=="</Parcel" (
		Set Block=false
::	Блок - обработка
		Call :BlockData
		Echo.
::	Блок - удаление
		For /F "tokens=1 delims==" %%B In ('Set BlockData_') Do (Set %%B=)
	)
:: 	Определение начала блока
	If "!Data:~,8!"=="<Parcel " (
		Set Block=true
		Set i=0
:: 	Чтение данных из заголовка
		Call :GetData "%%A" "CadastralNumber"
	)
:: 	Запись содержимого блока
	If Not "!Data:~,8!"=="<Parcel " If "!Block!"=="true" (
		Set /A i+=1
		Set "BlockData_!i!=!Data!"
	)
)
Echo All done
Pause&Exit

:BlockData
For %%A In (n d) Do Set %%A=0
:jmp
Set /A n+=1
:: Выбираем строки, содержащие номер точки
If Defined BlockData_%n% (
	If Not "!BlockData_%n%:%KeyWord%=!"=="!BlockData_%n%!" (
		Set /A d=n+Shift
:: 		Получаем номер точки и координаты
		Call :GetData "%%BlockData_!n!%%" "%KeyWord%"
		Call :GetData "%%BlockData_!d!%%" "Ordinate"
:: 		Выводим сами данные в нужном формате
		Echo !CadastralNumber!; !%KeyWord%!; !X!; !Y!; !Delta_Geopoint!
		Echo !CadastralNumber!; !%KeyWord%!; !X!; !Y!; !Delta_Geopoint!>>"%Result%"
	)
) Else Exit /B
GoTo :jmp

:GetData [1 - строка с данными, 2 - проверочное слово (не обязательно)]
For /F "tokens=1 delims=<>" %%? In ("%~1") Do (
	Set "Data=%%?"
:: 	Проверка на соответствие ожидаемой структуре
	If "!Data:%~2=!"=="!Data!" (Echo XML parsing error & Exit /B 1)
:: 	Подготавливаем строку к разбору
	Set "Data=!Data:"=!"
	Set "Data="!Data: =" "!""
:: 	Разбираем данные в цикле, читая пары ключ=значение
	For %%A In (!Data!) Do (For /F "tokens=1,* delims==" %%B In ("%%~A") Do (Set "%%~B=%%~C"))
)
Exit /B
Думаю, что комментарии помогут вам разобраться в логике работы, но если что - спрашивайте.

Последний раз редактировалось Anonymоus, 07-03-2014 в 09:07. Причина: исправлено

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:19, 07-03-2014 | #7

Название темы: [решено] парсинг xml :)