Войти

Показать полную графическую версию : [решено] работа с XML файлом


taravasya
28-03-2010, 03:48
Есть xml файл, следующего содержания:
<?xml version="1.0" encoding="utf-8"?>
<process><datetime>2010-03-27T12:01:35+02:00</datetime><code>500</code></process>
Естественно дата меняется регулярно в зависимости от времени внесения изменений в файл.
Цифры заключенные в теге code(в данном случае 500), так же варьируются(например 200, 250, 400, 500, 2000 и т.д.)
Задача:
Заменить из командной строки, цифры заключённые в теге code на 100
Если указывать явно, что на что менять то проблем нет. Но я не всегда заранее знаю, что в этом файле. А вот так что-бы заменить <code>???</code> - хоть убей ничего не выходит.
Не помог ни sed for Windows(хотя с ним я возможно не разобрался как следует, но уже сил не хватило моральных) ни CHGSTR.EXE(последний позволяет задать параметры поиска только для всей строки. а менять дату в этой строке нельзя.)
Спасибо.

El Sanchez
28-03-2010, 12:56
taravasya,


@echo off
setlocal EnableDelayedExpansion

set "Source=C:\Temp\Test.xml"
set "Output=C:\Temp\Test_output.xml"
set n=0

for /f "tokens=*" %%a in ('type %Source%') do (
set /a n+=1
set "str=%%a"
if !n! NEQ 1 (
for /f "tokens=2-6* delims==>" %%b in ('set str') do (
echo %%b^>%%c^>%%d^>%%e^>100^</code^>%%g>>%Output%
)
) else (
for /f "tokens=1* delims==" %%b in ('set str') do (
echo %%c>>%Output%
)
)
)

taravasya
28-03-2010, 13:44
Ох..... Спасибо. Уже не в первый раз выручаете. Сам бы, ни за что не составил бы такой скрипт....
Теперь остаётся прочитать Test_output.xml, и заменить его содержимым, содержимое Test.xml. С этим я думаю справлюсь. Ещё раз спасибо.

Nike-jersey
19-05-2017, 16:41
Приветствую!
У меня схожая задача, поэтому надеюсь добрые люди здесь помогут.
Дано: XML файл. В нём есть строка <UserId>OFFICE\Admin</UserId>
и нужно написать bat файл для автоматического редактирования OFFICE\Admin на имя ПК и имя текущего пользователя.
Какие в таком случае нужно использовать переменные?
Я второй день постигаю искусство написания скриптов. Вчера написал свой первый скрипт по пересозданию задания планировщика задач Windows.
Прошу помощи.

alpap
19-05-2017, 17:42
Nike-jersey,
если ничего "экзотического" в строках нет, будет работать и это:

@echo off
setlocal enabledelayedexpansion

set "f=file.xml" &: Файл в котором будет замена
set "sf=UserId" &: Поиск строки "<UserId>OFFICE\Admin</UserId>"
set "sz=%Computername%\%Username%" &: Здесь указать что вместо "OFFICE\Admin"

<"%f%">$ (for /f "delims=" %%A in ('more') do @echo "%%~A"|>nul find "%sf%" && (
for /f "tokens=1-3 delims=<>" %%a in ("%%~A") do @set "z=%%b"& echo:^<%%a^>!z:%%b^=%sz%!^<%%c^>
) || (
echo %%A
)
)& >nul move $ "%f%"
exit

greg zakharov
19-05-2017, 22:40
Самый простой способ разбора xml из командной строки - использовать xmlstarlet:
xml -L -u "/process/code" -v 1000 logged.xml
Тем более, что xmlstarlet умеет принимать данный из stdin.

Iska
20-05-2017, 01:07
greg zakharov, речь про это: XMLStarlet - Wikipedia (https://en.wikipedia.org/wiki/XMLStarlet)? Я не работал. Как он Вам показался?

greg zakharov
20-05-2017, 17:03
Iska, речь именно о нем. Кто бы что о нем не говорил, вещь очень хорошая. Если в трех словах - sed для xml. И этим, в общем-то, все сказано. Плохо, правда, что под Windows из исходников собирается с полпинка.

Iska
20-05-2017, 17:40
greg zakharov, спасибо, ясно.

Nike-jersey
25-05-2017, 15:17
@echo off
setlocal enabledelayedexpansion
set "f=file.xml" &: Файл в котором будет замена
set "sf=UserId" &: Поиск строки "<UserId>OFFICE\Admin</UserId>"
set "sz=%Computername%\%Username%" &: Здесь указать что вместо "OFFICE\Admin"
<"%f%">$ (for /f "delims=" %%A in ('more') do @echo "%%~A"|>nul find "%sf%" && (
for /f "tokens=1-3 delims=<>" %%a in ("%%~A") do @set "z=%%b"& echo:^<%%a^>!z:%%b^=%sz%!^<%%c^>
) || (
echo %%A
)
)& >nul move $ "%f%"
exit »

Было
Стало
Я попытался разобраться, что-то сложно.

greg zakharov
25-05-2017, 19:25
Nike-jersey, Вы бы привели пример файла. Примерное решение будет таким:
@echo off
setlocal enabledelayedexpansion
@<my.xml>my.xml:s1 (for /f "delims=" %%i in ('more') do (
echo:"%%~i"|>nul findstr /irc:"office\\admin"&&(
set "s=%%~i"
echo !s:office\admin=Domain\User!
)||echo:%%~i
))&&(more < my.xml:s1 > my.xml)
endlocal
exit /b

Iska
26-05-2017, 06:02
greg zakharov, не, я конечно, понимаю тягу к изыскам, но не настолько же неуёмным: то, что оригинальный файл в итоге так и остаётся с дополнительным потоком, не есть хорошо и правильно.

greg zakharov
26-05-2017, 09:20
Iska, при перезаписи основного потока ADS затирается. Если нет, загляните в групповые политики.

Iska
26-05-2017, 10:37
Iska, при перезаписи основного потока ADS затирается. »
Я не вижу этого у Вас в коде. Я вижу только:
> out.txt »

greg zakharov
28-05-2017, 07:36
Iska, очепятка. Бывает.

Iska
28-05-2017, 07:59
greg zakharov, ясно. Бывает. Сам только вчера в выложенном коде по недосмотру отладочную строку оставил.

greg zakharov
28-05-2017, 21:36
Iska, спасибо за проявленную бдительность.

Nike-jersey
06-06-2017, 16:54
@echo off
setlocal enabledelayedexpansion
@<my.xml>my.xml:s1 (for /f "delims=" %%i in ('more') do (
echo:"%%~i"|>nul findstr /irc:"office\\admin"&&(
set "s=%%~i"
echo !s:office\admin=Domain\User!
)||echo:%%~i
))&&(more < my.xml:s1 > my.xml)
endlocal
exit /b »

Спасибо за код, но по окончанию у меня строка меняется на
<UserId>Domain\User</UserId>

greg zakharov
07-06-2017, 09:13
Спасибо за код, но по окончанию у меня строка меняется на
<UserId>Domain\User</UserId>
Как подсказывает капитан Очевидность нужно заменять Domain\User в коде самого бата на свои, а если это делать влом, то параметризируйте сам бат и будет Вам счастье. Прочие консультации только за деньги вопросы в том же духе умаляют энтузиазм, так что имейте в виду.




© OSzone.net 2001-2012