LinuxForum.Fans
Тема

<XML>

Автор: semiono 45 сообщений 13601 просмотров
#307562

Если питон такой маленький и шустрый, то это мне нравится! :)

#307567
"-=Serj=-⇓" написал:
Как скажешь:) Вот вариант с использование стандартной библиотеки xml:

много букв... лучше через xpath сделать, как у меня...

semiono, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.

#307573
"Fat-Zer⇓" написал:
много букв... лучше через xpath сделать, как у меня...

Тогда, как я понимаю, сторонний модуль нужен, например, lxml.

"semiono⇓" написал:
Наверное нужен дистрибутив, он куда-то на диск C: ссылается, хотя у меня нет диска C:

Стоп. Это что за извращение?

"semiono⇓" написал:
xpars.exe parser.py -H 200 -V 100 file.xml

Посто

text

xpars.exe -H 200 -V 100 file.xml

xpars.exe - это уже готовая программа.

#307611
"-=Serj=-⇓" написал:
xpars.exe - это уже готовая программа.

а где ваш скрипт тогда? хм. надо проверить, напрямую значит через параметры, ясно..
хотя H и V могут встречаться многократно..
нужно искать заголовок

text
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 - пригодится в хозяйстве полюбому, спасиб!

#307613

, собственно попробуй с xmlstarlet'ом вариант с путём из моего скрипта... кавычки внутри важны, не забудь их на башевский манер переэкранировать...
лучше только его по строже сделать, чтобы имена для obj'а и member'а проверял.

Меня очень xmlstarlet разочаровал! Казалось бы вот оно то что надо!
Но он умеет только с <tag>10</tag> работать, либо переименовывать, а вот с такими данными никак
<tag neme="abc" value="10"/>
Во всяком случае я не нашёл.

Блин! Кажись нашёл! Видимо выспаться надо было вчера)

#307634

Либо это баг либо фитча.

text
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
а про буквы и забыли)

#307639
"semiono⇓" написал:
работает только в том случае если 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]

"-=Serj=-⇓" написал:
Тогда, как я понимаю, сторонний модуль нужен, например, lxml.

должны быть встроенные средства для работы с xpath'ом... но сейчас искать лень...

#307640

Неужели работает! Ура! А я уже вбил письмо https://sourceforge.net/ :)

Блин, точно.. с одиночными кавычками работает! Спасибо!
Ещё вы с длиными путями помогли в квадратных скобках, я там много гадал как это записать!

А у них на форуме я видел даже -x ключ применяется, хотя из документации там чё-то невнятное было.. (-x is not implemented yet)

#307711

А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?

#307829
"semiono⇓" написал:
А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?

да...
может если раскурить ман, то может у утилитки и есть ключик типа sed'овского -i...

#307833
"semiono⇓" написал:
А всё это дело через вывод в файл > делается? Или можно исходный файл сразу отредактировать?

Если нужно исходный редактировать, могу свой скрипт подправить. Он заработал?

#307855
-=Serj=- написал:
Если нужно исходный редактировать, могу свой скрипт подправить. Он заработал?

Да, работает! Давай!
Уточню тогда, ещё важно <obj class="UPoint" name="Size" ID="182564128"> указывать, потому что obj могут дважды в блоке находится.
Пример ещё

text
<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 это скампилированный скрипт у вас, верно же? :)
Интересно, я тогда хочу поставить питон и сам такие писать)
Только надо посмотреть насколько это практически полезно.

#307862
"semiono⇓" написал:
Уточню тогда, ещё важно <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>
"semiono⇓" написал:
Я понял, xpars.exe это скомпилированный скрипт у вас, верно же?

Скорее, это скрипт и интерпретатор, упакованные в exe.

#307867
"-=Serj=-⇓" написал:
Опять не понятно, в предыдущем примере значение name="Location"

У меня просто XML большой и там много блоков разных, меня питон уже больше теоретически заинтересовал.
Практически XMLStarlet пойдёт.

#307868
"Fat-Zer⇓" написал:
может если раскурить ман, то может у утилитки и есть ключик типа sed'овского -i...

Вот это было бы оочень здорово!

#307869
-=Serj=- написал:
Скорее, это скрипт и интерпретатор, упакованные в exe.

Если не трудно напиши любой пример, я просто погоняю по XML сам поучусь.
Только с перезаписью XML

#307870

xml.exe хорош тем что можно находу применять в любой ситуации, однако плохо что его вызывать нужно, да ещё и с копированием в другой файл >
то-есть если нужно исправить несколько параметров в нужном xml, то приходится его каждый раз перезаписывать.


Вот на Fasm что получилось

text
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'

Всего четыре параметра поправить приходится четыре раза файл переписывать...

#307872
"semiono⇓" написал:
Если не трудно напиши любой пример, я просто погоняю по XML сам поучусь.
Только с перезаписью XML

Для перезаписи достаточно в этом варианте XML заменить предпоследнюю строчку

text

with open('new.xml', 'w') as f:

на

text

with open(fname, 'w') as f:
#307943
Fat-Zer написал:

да...
может если раскурить ман, то может у утилитки и есть ключик типа 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'

Войдите или зарегистрируйтесь, чтобы ответить.