Войти

Показать полную графическую версию : [решено] XMLStarlet Command Line XML Toolkit


semiono
08-03-2013, 23:34
Помогите разобраться, нужно установить другие значения 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/UG/xmlstarlet-ug.html

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

semiono
08-03-2013, 23:44
# 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
Цигвин ставить не стал.
На 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
Ох, PowerShell на XP не станет, сначала скажет установить Framework 3.5 которого по-умолчанию даже в Win8 нету, потом будет устанавливать 15 минут, а потом скажет ещё WIC установить, а потом скажет что платформа x64 не поддерживается.
Пришло время батники при помощи NET писать :(

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

Foreigner
09-03-2013, 18:14
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
Ребята, работает! Тут конечно надо внимание и терпение с первого раза в 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
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'


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




© OSzone.net 2001-2012