Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] поиск по xml (http://forum.oszone.net/showthread.php?t=257603)

firstarey 01-04-2013 09:14 2123257

поиск по xml
 
суть:
есть xml файлы, надо вытащить информацию из определенного тега

как делаю:

Код:

set File_name=file.xml
rem как бы имя проще получать ? так чтоб перетаскиваешь xml на
rem батник и батник в итоге получает имя xml файла
rem это что то типа:
rem set File_name=%1

findstr "<CadastralNumber>" %File_name% >1.txt
rem находим по тегу кадастровый номер

For /F "tokens=1,2* Delims=<CadastralNumber>" %%a In (1.txt) Do (echo %%a >>KADNumber.txt)
rem обрезаем тег <CadastralNumber>

Вопрос:
как оставить только 1 строку ? т.к. последние 2 явно подрезаны и не актуальны

For /F "tokens=1,2,3,4* Delims=:" %%a In (KADNumber.txt) Do (
echo K_Region = %%a        регион >>out.txt
echo K_Raion = %%b        район >>out.txt
echo K_kvartal = %%c        квартал >>out.txt
if %%d NEQ "" (echo K_uchastok = %%d        участок >>out.txt)
)
rem приводим к удобному виду

Проблема указана в вопросе, собсно надо как то оставить лишь первый результат или удалить остальные строки, кроме первой
Возможно предложите более элегантное решение :)

dark-------13 01-04-2013 11:16 2123310

Может поможет делал на powershell http://forum.oszone.net/thread-257380.html

Код:

[xml]$text = Get-Content "D:\base64\obr.xml"
$text.CLIENTS.client | Foreach {
$a=" <div align=""center""> "
$b="</div>"
$a
"<br>"+$_.LASTNAME
"<br>"+$_.FIRSTNAME
"<br>"+$_.MIDNAME+"<br>"
"<img src=""data:image/png;base64,"+$_.portrait+""" />"+
"<img src=""data:image/png;base64,"+$_.signature+""" />"
"<br>"
"----------------------------------------"
$b


} |Out-File D:\base64\result.html  -encoding  Default


firstarey 01-04-2013 11:30 2123316

Цитата:

Цитата dark-------13
Может поможет делал на powershell »

powershell использовать нет возможности т.к. на рабочих компах win xp, а местные админы не желают ставить компоненту powershell

dark-------13 01-04-2013 12:47 2123381

Я делал скрипт на bat для обработки xml но не для выборки данных между тегами а для замены тегов отрабатывает 6 часов файл размером всего 5 мб. Сделал на vbs отработал за 1 секунду, на powershell уже делал изъятие данных между тегов отрабатывает за 3 сек. Так что смотрите может на vbs сделаете или помогут в разделе VBS.
А может есть компилятор типа powershell to exe ?! Сам не искал для Powershell, но для php такой есть.

firstarey 01-04-2013 13:08 2123410

Цитата:

Цитата dark-------13
может на vbs сделаете или помогут в разделе VBS »

VBS к сожалению не владею.. так что даже если и помогут, то только в виде готового решения и я весьма скромно смогу отредактировать.

Iska 01-04-2013 14:02 2123466

Цитата:

Цитата firstarey
powershell использовать нет возможности т.к. на рабочих компах win xp, а местные админы не желают ставить компоненту powershell »

Бейте их больно. Пусть ставят.

Vadikan 01-04-2013 14:15 2123480

Powershell в XP устанавливается в качестве обновления Windows.

Dragokas 01-04-2013 15:22 2123529

firstarey, так что-ли:
Код:

For /F "tokens=2-4 Delims=<>:" %%a In ('find "<CadastralNumber>" ^<"file.xml"') Do echo %%a,%%b,%%c

firstarey 01-04-2013 15:41 2123545

Цитата:

Цитата Diskretor
так что-ли: »

да, спасибо, только в моем случае:
Код:

For /F "tokens=2-5 Delims=<>:" %%a In ('find "<CadastralNumber>" ^<"file.xml"') Do For /F "tokens=2-5 Delims=<>:" %%a In ('find "<CadastralNumber>" ^<"file.xml"') Do (
set K_Region=%%a
set K_Raion=%%b
set K_kvartal=%%c
if %%d=="" (set KPT=1) else set K_uchastok=%%d
)
echo %%a:%%b:%%c:%%d

и вот с последней (%%d) переменной проблема - в нее записывается последнее (не полное) значение (3 вместо 38 в данном примере)

Dragokas 01-04-2013 16:00 2123584

firstarey, приложенный Вами код не работает вообще.

Так?
Код:

@echo off
For /F "tokens=2-5 Delims=<>:" %%a In ('find "<CadastralNumber>" ^<"file.xml"') Do (
  set K_Region=%%a
  set K_Raion=%%b
  set K_kvartal=%%c
  set K_uchastok=%%d
  goto :_ext
)
:_ext
echo %K_Region%:%K_Raion%:%K_kvartal%:%K_uchastok%
pause

Не нужно ничего усложнять.

firstarey 02-04-2013 06:27 2124050

Цитата:

Цитата Diskretor
приложенный Вами код не работает вообще »

виноват, поторопился, дважды For указал
Цитата:

Цитата Diskretor
Так? »

да, goto в данном случае спасает от поиска всех результатов и получается только первый найденный.

благодарю за наводку :)

firstarey 02-04-2013 14:06 2124263

суть:
последний кусок кода, комментарием выделена строка (83)
переменная не желает принимать значение которое ей хочу присвоить (видно по выводу echo)

при этом отдельно данный кусок кода прекрасно себя чувствует.
подозрения падают на %K_ucastok% что тут может быть не так ? голову сломал

сам скрипт целиком:
читать дальше »
Код:

@echo off
Color 0e

rem задаем переменные:
set File_name=file.xml
:: как бы имя проще получать ? так чтоб перетаскиваешь xml на
:: батник и батник в итоге получает имя xml файла
:: это что то типа:
:: set File_name=%1
set base_region=region.txt
set base_rayion=rayion.txt
set KPT=0

rem находим по тегу кадастровый номер:
For /F "tokens=2-5 Delims=<>:" %%a In ('find "<CadastralNumber>" ^<"%File_name%"') Do (
        set K_Region=%%a
        set K_Rayion=%%b
        set K_kvartal=%%c
        if %%d=="" (set KPT=1) else set K_uchastok=%%d
        goto :_ext1
)
:_ext1
rem выводим результат на экран:
if %KPT%==0 (
        echo ®, ¤*, нв® ‚›Џ€‘ЉЂ!!
        echo ====================
        echo %K_Region%:%K_Rayion%:%K_kvartal%:%K_uchastok%
        echo ====================
        echo.
)
if %KPT%==1 (
        echo ®, ¤*, нв® ЉЏ’!!
        echo ================
        echo %K_Region%:%K_Rayion%:%K_kvartal%
        echo ================
        echo.
)

rem находим название региона по номеру:
for /f "delims=] tokens=1*" %%a in ('find /n "%K_Region%" %base_region%') do (set T_Region=%%b)
set region=%T_Region:~4,50%
rem выводим результат на экран:
echo %T_Region:~1,50%

rem находим название района по номеру:
rem проверка на условный кад район
if %K_Rayion%==00 (
        set rayion=“б«®ў*л© Є*¤*бва®ўл© а*©®*
        echo 00=“б«®ў*л© Є*¤*бва®ўл© а*©®*
        goto :_ext2
)
for /f "delims=] tokens=1*" %%a in ('find /n "%K_Rayion%" %K_Region%_%base_rayion%') do (set T_Rayion=%%b)
set rayion=%T_Rayion:~4,50%
rem выводим результат на экран:
echo %T_Rayion:~1,50%
:_ext2

rem проверяем существует ли каталог:
rem %~p0
if NOT exist "%K_Region%_%region%\%K_Region%_%K_Rayion%_%rayion%\%K_Region%_%K_Rayion%_%K_kvartal%\" MD "%K_Region%_%region%\%K_Region%_%K_Rayion%_%rayion%\%K_Region%_%K_Rayion%_%K_kvartal%\"

rem подсчет количества символов в обозначении участка:
call :var_Count "%K_uchastok%" K_uchastok_zero
if %K_uchastok_zero%==1 set K_uchastok=000%K_uchastok%
if %K_uchastok_zero%==2 set K_uchastok=00%K_uchastok%
if %K_uchastok_zero%==3 set K_uchastok=0%K_uchastok%
goto :_ext3
 
:var_count
set var=%~1
if not defined var exit /b
set var=%var:~1%
set /a %2+=1
call :var_count "%var%" %2
exit /b

:_ext3
rem переименовываем файл:
if %KPT%==0 (
        set new_file_name=Љ‚‡“_%K_uchastok%_%date:~6,4%-%date:~3,2%-%date:~0,2%.xml
        echo Ќ®ў®Ґ Ё¬п д*©«*:=Љ‚‡“_%K_uchastok%_%date:~6,4%-%date:~3,2%-%date:~0,2%.xml
        echo Ќ®ў®Ґ Ё¬п д*©«*:=%new_file_name%
        rem именно тут каккая то проблема ^^
        rem т.е. в переменную не уходит значение
        echo %~p0%file_name%
        echo %~p0%new_file_name%
        ren %file_name% %new_file_name%
        pause
        move %new_file_name% "%K_Region%_%region%\%K_Region%_%K_Rayion%_%rayion%\%K_Region%_%K_Rayion%_%K_kvartal%\"
        echo Ќ®ў*п Ї*ЇЄ* д*©«*:="%K_Region%_%region%\%K_Region%_%K_Rayion%_%rayion%\%K_Region%_%K_Rayion%_%K_kvartal%\"
)
pause




отдельно проблемный кусок, работает без проблем:
читать дальше »
Код:

@echo off
set File_name=file.xml
set K_uchastok=0038
set new_file_name=Љ‚‡“_%K_uchastok%_%date:~6,4%-%date:~3,2%-%date:~0,2%.xml
echo Ќ®ў®Ґ Ё¬п д*©«*:=Љ‚‡“_%K_uchastok%_%date:~6,4%-%date:~3,2%-%date:~0,2%.xml
echo Ќ®ў®Ґ Ё¬п д*©«*:=%new_file_name%
echo %~p0%file_name%
echo %~p0%new_file_name%
ren %file_name% %new_file_name%
pause



весь набор прилагаю во вложении

Dragokas 02-04-2013 16:53 2124370

Новое значение, присвоенное переменной под скобками, циклом или конкатенацией команд (&), можно получить из нее, не выходя из этой же конструкции, раскрывая только через восклицательные знаки:
Код:

set new_file_name=value
(
  set new_file_name=new value
  echo %new_file_name%
  echo !new_file_name!
)

Это называется режим отложенного расширения переменных среды, который необходимо предварительно включить, расположив в начале пакетного файла директиву:
Код:

Setlocal EnableDelayedExpansion
либо запуская бат-файл следующим способом:
Код:

cmd /v:on /c batnik.bat
P.S. Чтобы не использовать несколько кодировок (обе Win-1251 и DOS OEM-866) в пакетном файле, достаточно сохранить файл любым вменяемым редактором (например, AkelPad) в кодировке DOS.

firstarey 04-04-2013 11:24 2125533

Очередная заминка:

не все *.XML файлы отформатированы с переносом строки, т.е. попадаются файлы где нет переноса на след строку после закрытия тега, например фрагмент:
Код:

<Location><Code_OKATO>57401380000</Code_OKATO></Location><Parcels><Parcel CadastralNumber="59:01:4410923:25" Name="01" State="01" DateCreated="2006-09-13"><Areas><Area><AreaCode>009</AreaCode>
т.е. весь файл в одну строку.
соответственно
Цитата:

Цитата firstarey
сам скрипт целиком: »

уже не может обработать файл..

через Notepad++ делается просто, но хочется автоматизировать процесс.

сейчас поиск номера (59:01:4410923:25) выполняется следующим образом:
читать дальше »
Код:

set File_name=file.xml
:: как бы имя проще получать ? так чтоб перетаскиваешь xml на
:: батник и батник в итоге получает имя xml файла
:: это что то типа:
:: set File_name=%1
set KPT=0

For /F "tokens=2-5 Delims=: " %%a In ('find "<Parcel CadastralNumber=" ^<"%File_name%"') Do (
        set K_Region=%%a
        set K_Rayion=%%b
        set K_kvartal=%%c
        if %%d=="" (set KPT=1) else set K_uchastok=%%d
        goto :_ext1
)
:_ext1

set K_Region=%K_Region:~17,2%
set K_uchastok=%K_uchastok:~0,-1%
echo %K_Region%:%K_Rayion%:%K_kvartal%:%K_uchastok%
pause



Возможно ли как то через cmd реализовать замену "><" на ">перенос строки<" (>/n< в Notepad++)?
Ну или другой вариант? возможно изменить алгоритм поиска ?

второй вопрос:
как бы имя обрабатываемого файла проще получать ? так чтоб перетаскиваешь xml на
батник и батник в итоге получает имя xml файла в переменную

Iska 04-04-2013 17:11 2125704

Цитата:

Цитата firstarey
второй вопрос:
как бы имя обрабатываемого файла проще получать ? так чтоб перетаскиваешь xml на
батник и батник в итоге получает имя xml файла в переменную »

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sFile=%~1

if defined sFile (
        if exist "%sFile%" (
                rem Здесь Ваш код
        ) else (
                echo File [%sFile%] not found
        )
) else (
        echo Usage: %~0 ^<path to xml file^>
)

endlocal
exit /b 0



Время: 17:08.

Время: 17:08.
© OSzone.net 2001-