Если питон такой маленький и шустрый, то это мне нравится! :)
<XML>
Как скажешь:) Вот вариант с использование стандартной библиотеки xml:
много букв... лучше через xpath сделать, как у меня...
semiono, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.
много букв... лучше через xpath сделать, как у меня...
Тогда, как я понимаю, сторонний модуль нужен, например, lxml.
Наверное нужен дистрибутив, он куда-то на диск C: ссылается, хотя у меня нет диска C:
Стоп. Это что за извращение?
xpars.exe parser.py -H 200 -V 100 file.xml
Посто
xpars.exe -H 200 -V 100 file.xml
xpars.exe - это уже готовая программа.
xpars.exe - это уже готовая программа.
а где ваш скрипт тогда? хм. надо проверить, напрямую значит через параметры, ясно..
хотя H и V могут встречаться многократно..
нужно искать заголовок
grep -A 4 "TransportWindow"
<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"/>Стоп. Это что за извращение?
У меня на диске C: стоит CRUX, а я сейчас в Windows.
Я имел ввиду дистрибутив питона, там наверное инклюды должны быть и библиотеки.. я сам поищу.
А может и Perl под винду есть, хотя пакеты с множеством файлов неохота юзать, вот когда один ексешник это мне нравиться)
xpars.exe - пригодится в хозяйстве полюбому, спасиб!
, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.
Меня очень xmlstarlet разочаровал! Казалось бы вот оно то что надо!
Но он умеет только с <tag>10</tag> работать, либо переименовывать, а вот с такими данными никак
<tag neme="abc" value="10"/>
Во всяком случае я не нашёл.
Блин! Кажись нашёл! Видимо выспаться надо было вчера)
Либо это баг либо фитча.
xml ed -u "/item/int[name="H"]/@value" -v 10 z.xmlработает только в том случае если name имеет числовое значение, а не буквенное 0_0
Конечно, у них в документации id="5" :)
http://xmlstar.sourceforge.net/doc/UG/ch04s03.html
а про буквы и забыли)
работает только в том случае если name имеет числовое значение, а не буквенное 0_0
кавычки нормально поставь ли заэскейпь...
[console]
alexander@goblin /tmp $ cat 1.xml |grep -C4 'name="H"'
<item>
<string name="Group" value="TrackEffectWindow"/>
<member name="Values">
<obj class="UPoint" name="Location" ID="183011808">
<int name="H" value="1"/>
<int name="V" value="1"/>
</obj>
<int name="State" value="1"/>
</member>
--
<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>
alexander@goblin /tmp $ xml ed -u "/Defaults/list/item[string[@value='TransportWindow']]/member/obj/int[@name='H']/@value" -v 100500 1.xml |grep -C4 'name="H"'
<item>
<string name="Group" value="TrackEffectWindow"/>
<member name="Values">
<obj class="UPoint" name="Location" ID="183011808">
<int name="H" value="1"/>
<int name="V" value="1"/>
</obj>
<int name="State" value="1"/>
</member>
--
<item>
<string name="Group" value="TransportWindow"/>
<member name="Values">
<obj class="UPoint" name="Location" ID="215319288">
<int name="H" value="100500"/>
<int name="V" value="690"/>
</obj>
</member>
</item>
[/console]
Тогда, как я понимаю, сторонний модуль нужен, например, lxml.
должны быть встроенные средства для работы с xpath'ом... но сейчас искать лень...
Неужели работает! Ура! А я уже вбил письмо https://sourceforge.net/ :)
Блин, точно.. с одиночными кавычками работает! Спасибо!
Ещё вы с длиными путями помогли в квадратных скобках, я там много гадал как это записать!
А у них на форуме я видел даже -x ключ применяется, хотя из документации там чё-то невнятное было.. (-x is not implemented yet)
А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?
должны быть встроенные средства для работы с xpath'ом... но сейчас искать лень...
Да, ты прав - http://docs.python.org/2/library/xml.etree.elementtree.html#xpath-support
А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?
да...
может если раскурить ман, то может у утилитки и есть ключик типа sed'овского -i...
А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?
Если нужно исходный редактировать, могу свой скрипт подправить. Он заработал?
Если нужно исходный редактировать, могу свой скрипт подправить. Он заработал?
Да, работает! Давай!
Уточню тогда, ещё важно <obj class="UPoint" name="Size" ID="182564128"> указывать, потому что obj могут дважды в блоке находится.
Пример ещё
<Defaults>
<list name="Entries" type="list">
<item>
<string name="Group" value="PArrangeWindow"/>
<member name="Values">
<int name="Show Inspector" value="1"/>
<obj class="UPoint" name="Size" ID="182564128">
<int name="H" value="1440"/>
<int name="V" value="848"/>
</obj>
<int name="Snap Mode" value="0"/>
</member>
</item>
</list>
</Defaults>Я понял, xpars.exe это скампилированный скрипт у вас, верно же? :)
Интересно, я тогда хочу поставить питон и сам такие писать)
Только надо посмотреть насколько это практически полезно.
Уточню тогда, ещё важно <obj class="UPoint" name="Size" ID="182564128"> указывать, потому что obj могут дважды в блоке находится.
Опять не понятно, в предыдущем примере значение name="Location"
Уточните критерии.
<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>
Я понял, xpars.exe это скомпилированный скрипт у вас, верно же?
Скорее, это скрипт и интерпретатор, упакованные в exe.
Опять не понятно, в предыдущем примере значение name="Location"
У меня просто XML большой и там много блоков разных, меня питон уже больше теоретически заинтересовал.
Практически XMLStarlet пойдёт.
может если раскурить ман, то может у утилитки и есть ключик типа sed'овского -i...
Вот это было бы оочень здорово!
Скорее, это скрипт и интерпретатор, упакованные в exe.
Если не трудно напиши любой пример, я просто погоняю по XML сам поучусь.
Только с перезаписью XML
xml.exe хорош тем что можно находу применять в любой ситуации, однако плохо что его вызывать нужно, да ещё и с копированием в другой файл >
то-есть если нужно исправить несколько параметров в нужном xml, то приходится его каждый раз перезаписывать.
Вот на Fasm что получилось
include '%fasm%/win64ax.inc'
section '.code' executable
start:
sub rsp,8
invoke GetSystemMetrics,SM_CXSCREEN
invoke wsprintf,a,\
'/c xml ed -S -O -u "/Defaults/list/item[string[@value=''PArrangeWindow'']]/member/obj/int[@name=''H'']/@value" -v %d Defaults.xml> tmp',eax
invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE
invoke Sleep,100
invoke CopyFile,'tmp','Defaults.xml',NULL
invoke GetSystemMetrics,SM_CYSCREEN
sub eax,52
invoke wsprintf,a,\
'/c xml ed -S -O -u "/Defaults/list/item[string[@value=''PArrangeWindow'']]/member/obj/int[@name=''V'']/@value" -v %d Defaults.xml> tmp',eax
invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE
invoke Sleep,100
invoke CopyFile,'tmp','Defaults.xml',NULL
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',eax
invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE
invoke Sleep,100
invoke CopyFile,'tmp','Defaults.xml',NULL
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',eax
invoke ShellExecute,NULL,NULL,'cmd.exe',a,NULL,SW_HIDE
invoke Sleep,100
invoke CopyFile,'tmp','Defaults.xml',NULL
invoke Sleep,10
invoke DeleteFile,'tmp'
exit:
invoke ExitProcess,NULL
section '.data' readable writeable
a 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'
Всего четыре параметра поправить приходится четыре раза файл переписывать...
да...
может если раскурить ман, то может у утилитки и есть ключик типа sed'овского -i...
Там есть -i , но блин даже на форуме никто не отвечает, а в документации нет примеров.
Мне показалось, что без заголовка
<?xml version="1.0" ?>
вставка не работает.
А вот реплика с форума
xml ed -i -t comment -n '' -v 'comment contents here'
тоже не получилось у меня.
Уж лучше копировать :)
ShellExecute() cmd.exe '/c xml ... Defaults.xml> tmp && move /y tmp Defaults.xml && del tmp'