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

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

Пользователь


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

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


Anonymоus, благодарю.
моих навыков работы с командной строкой не хватает для понимания работы некоторых моментов. буду рад если Вы откликнитесь.

во первых:
Код: Выделить весь код
:: Читаем документ поблочно
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=)
	)
попробую построчно разобрать и сразу задавать вопросы
1. берем строку целиком
2. присваиваем в переменную data (почему в кавычках??)
3. если переменная block равна true если нашли строку начинающуюся на </Parcel (т.е. тут сначала выполняется второе if ? если выполнилось второе if, то переменной Block присвоить true?)
4. в переменную block записать значение false
5. вызываем blockData из цикла
6. пропускаем строку (так понимаю для наглядности отображения при выполнении, чтобы разбить блоки пустой строкой ?)
7. не понял эту строку.. в цикле берем первую подстроку после "=" из..(что делает ('Set BlockData_')??) и далее для меня тоже не понятно что выполняется в Do (Set %%B


Код: Выделить весь код
: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
так же куча вопросов:
1. как это работает и что нам дает? For %%A In (n d) Do Set %%A=0
2. добавить к переменной n единицу ?
3. если существует строка n (
4. если не существует строка n:Su_Nmb ... как это работает ?
5. в переменную d записать значение строки+(как cmd поймет Shift??)
6. вызываем GetData с параметром "номер строки" "Su_Nmb"
7. вызываем GetData с параметром "номер строки+shift" "Ordinate"
8. все еще внутри цикла выводим результат на экран (!%KeyWord%! - и знак "!" и "%" ?)
9. выводим найденное в файл результата
10. если не нашли нужную строку, то выход ?
11. повторили поиск нужной строки..


Код: Выделить весь код
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"))
)
1. берем из указанной параметром %~1 строки первую подстроку разделенную < и >. как работает %%?
2. присвоить переменной data.. а что ей присвоить ?
3. проверку тоже не понял. как сработает проверка значения ? переменная без первых двух значений проверяется на равенство самой себе
4. set data тоже не понял..
5. опять не понял..


Боюсь Ваше решение моего вопроса принесло еще больше вопросов
на самом деле мне действительно интересно понять как работает Ваша конструкция и я надеюсь Вы прокомментируете более подробно описанные моменты.

Отправлено: 11:46, 07-03-2014 | #10

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