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

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

semiono 08-03-2013 23:34 2107098

XMLStarlet Command Line XML Toolkit
 
Помогите разобраться, нужно установить другие значения H и V для "TransportWindow"


Пример: file.xml
Код:

<Defaults>
  <list name="Entries" type="list">

      <item>
        <string name="Group" value="zzzz"/>
        <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
              <int name="H" value="321"/>
              <int name="V" value="690"/>
            </obj>
        </member>
      </item>

      <item>
        <string name="Group" value="TransportWindow"/>
        <member name="Values">
            <obj class="UPoint" name="Location" ID="215319288">
              <int name="H" value="321"/>
              <int name="V" value="690"/>
            </obj>
        </member>
      </item>

            </list>
</Defaults>

По документации получается выполнить элементарное, но в моём случае не могу понять.
http://xmlstar.sourceforge.net/doc/U...tarlet-ug.html

Если есть варианты BAT/CMD тоже пишите, хотя xml.exe придуман именно для этих целей.

semiono 08-03-2013 23:44 2107102

# xml ed -u "/Defaults/list/item/string[@value=TransportWindow]/member/obj/int[@name=H]" -v 777 file.xml
я думаю поля которые не значимые можно не указывать, например <list name="Entries" type="list"> ?

Foreigner 09-03-2013 08:18 2107193

Цигвин ставить не стал.
На PowerShell:
Код:

$xml = new-object xml
$xml.load("C:\file.xml")

$xml.defaults.list.item[1].member.obj.int[0].value = '333'
$xml.defaults.list.item[1].member.obj.int[1].value = '555'

$xml.save("C:\file.xml")

Или так:
Код:

$xml = new-object xml
$xml.load("C:\file.xml")

$xml.defaults.list.item | % {
   
    if ($_.string.value -eq "TransportWindow") {
   
        $_.member.obj.int | % {

            if ($_.name -eq 'H') { $_.value = '333' }
            if ($_.name -eq 'V') { $_.value = '555' }
                               
        } 
       
    }   
   
}

$xml.save("C:\file.xml")


semiono 09-03-2013 15:26 2107362

Ох, PowerShell на XP не станет, сначала скажет установить Framework 3.5 которого по-умолчанию даже в Win8 нету, потом будет устанавливать 15 минут, а потом скажет ещё WIC установить, а потом скажет что платформа x64 не поддерживается.
Пришло время батники при помощи NET писать :(

Если кто сможет на cmd.exe языке cmd/bat напишите пожалуйста?

Foreigner 09-03-2013 18:14 2107442

semiono,
Плох cmd для разбора текста вообще и xml в частности. Только для конкретного файла:
Код:

@echo off
setlocal

for /f "tokens=1,2 delims=:" %%i in ('findstr /n "." file.xml') do call:1 %%i "&%%j"

set "str_118=%str_118:321=333%"
set "str_119=%str_119:690=555%"

for /f "tokens=2 delims=&" %%i in ('set str_') do 1>>file.xml echo %%i
goto:eof

:1
set /a num=100+%1
set "str_%num%=%~2"


semiono 09-03-2013 21:43 2107598

Ребята, работает! Тут конечно надо внимание и терпение с первого раза в XML, но инструмент работает!
Код:

xml ed -u "/Defaults/list/item[string[@value='TransportWindow']]/member/obj/int[@name='H']/@value" -v 100500 file.xml
Имя нельзя в двойные кавычки указывать "H", хотя цифры почему-то можно)
И с путями XPath тоже документация не очень, но разобрались.

xml.exe 2.10 MB :)

Foreigner, спасибо, пригодится!

semiono 10-03-2013 21:26 2108274

Fasm + XMLStarlet

Код:

include '%fasm%/win64ax.inc'
section '.code' executable
start:
        sub rsp,8

        invoke SHGetSpecialFolderPath,NULL,b,CSIDL_APPDATA,NULL
        invoke lstrcat,b,'\Steinberg\Nuendo 4'

        invoke GetSystemMetrics,SM_CXSCREEN
        invoke wsprintf,a,\
              '/c xml ed -S -O -u "/Defaults/list/item[string[@value=''PArrangeWindow'']]/member/obj[@name=''Size'']/int[@name=''H'']/@value" -v %d Defaults.xml> tmp && move /y tmp Defaults.xml',eax
        invoke ShellExecute,NULL,NULL,'cmd.exe',a,b,SW_HIDE

        invoke GetSystemMetrics,SM_CYSCREEN
        sub eax,52
        invoke wsprintf,a,\
              '/c xml ed -S -O -u "/Defaults/list/item[string[@value=''PArrangeWindow'']]/member/obj[@name=''Size'']/int[@name=''V'']/@value" -v %d Defaults.xml> tmp && move /y tmp Defaults.xml',eax
        invoke ShellExecute,NULL,NULL,'cmd.exe',a,b,SW_HIDE

        invoke GetSystemMetrics,SM_CXSCREEN
        shr eax,1
        sub eax,399
        invoke wsprintf,a,\
              '/c xml ed -S -O -u "/Defaults/list/item[string[@value=''TransportWindow'']]/member/obj/int[@name=''H'']/@value" -v %d Defaults.xml> tmp && move /y tmp Defaults.xml',eax
        invoke ShellExecute,NULL,NULL,'cmd.exe',a,b,SW_HIDE

        invoke GetSystemMetrics,SM_CYSCREEN
        sub eax,220
        invoke wsprintf,a,\
              '/c xml ed -S -O -u "/Defaults/list/item[string[@value=''TransportWindow'']]/member/obj/int[@name=''V'']/@value" -v %d Defaults.xml> tmp && move /y tmp Defaults.xml && del tmp',eax
        invoke ShellExecute,NULL,NULL,'cmd.exe',a,b,SW_HIDE
exit:
        invoke ExitProcess,NULL

section '.data' readable writeable

        a rb MAX_PATH
        b rb MAX_PATH

section '.idata' import readable

        library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',user32,'USER32.DLL'
        include '%fasm%/api/kernel32.inc'
        include '%fasm%/api/shell32.inc'
        include '%fasm%/api/user32.inc'

Устанавливает размеры окна программы относительно разрешения экрана.


Время: 17:52.

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