Войти

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


Страниц : 1 [2]

Creat0R
16-11-2010, 23:11
пойдёт ли то, что ты написал без изменений? »
Нет, это уже специфичная задача.

$sFile = @DesktopDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@desktopdir) & "\Test.xml"
$sHValue = @DesktopWidth (http://www.autoitscript.com/autoit3/docs/macros.htm#@desktopwidth)
$sVValue = @DesktopHeight (http://www.autoitscript.com/autoit3/docs/macros.htm#@desktopheight)

$sData = FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sFile)
$sData = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sData, '(?si)(<obj.*name="Location".*?>.*?(?!</obj>)<int name="H" value=")\d*("/>)', '${1}' & $sHValue & '$2')
$sData = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sData, '(?si)(<obj.*name="Location".*?>.*?(?!</obj>)<int name="V" value=")\d*("/>)', '${1}' & $sVValue & '$2')

$hFile = FileOpen (http://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm)($sFile, 2)
FileWrite (http://www.autoitscript.com/autoit3/docs/functions/FileWrite.htm)($hFile, $sData)
FileClose (http://www.autoitscript.com/autoit3/docs/functions/FileClose.htm)($hFile)

semiono
16-11-2010, 23:53
Большое спасибо!
А глобальный заголовок проверить?

<!-- ArrangeWindow -->
....

<obj class="UPoint" name="Size" ID="182564128">
<int name="H" value="1152"/>
<int name="V" value="864"/>
</obj>
...

<!-- Event Image -->
...

<!-- Enable Record on Select Track -->
....

<!-- Registration -->
...итд

Без этого не получится к сожалению. Может через If EndIf как-то?

Нет, это уже специфичная задача. »

Я бы сказал даже отвратительно запутанная.

semiono
17-11-2010, 00:18
$sData = FileRead($sFile)
If StringInStr($sData, "<!-- ArrangeWindow -->") <> 0 Then
$sData = StringRegExpReplace(...

Кажись работает! Только наверное не совсем правильно?

Creat0R
17-11-2010, 00:32
наверное не совсем правильно? »
Почему нет, если оно должно присутствовать в файле, значит видимо проверка не лишняя.

semiono
17-11-2010, 01:00
Нет, не работает.

Если две секции

<!-- ArrangeWindow -->
...
<!-- Event Image -->
...

то StringRegExpReplace() работает всегда с последней секцией.
StringInStr просто проверяет весь файл на наличие <!-- ArrangeWindow -->
А вот как зделать чтобы обрабатывался именно блок <!-- ArrangeWindow -->

http://forum.oszone.net/post-1544021-19.html

Зацепка только одна, то что в конце всегда стоит безымянный тэг </item>

Creat0R
17-11-2010, 15:12
tringRegExpReplace() работает всегда с последней секцией »
Он работает с той где найдено совпадение по шаблону. У тебя постоянно появляются новвые условия задачи, нужно либо учить RegExp, либо чётко знать что требуется получить.

$sData = StringRegExpReplace($sData, '(?si)(<!-- ArrangeWindow -->.*?<obj.*name="Location".*?>.*?(?!</obj>)<int name="H" value=")\d*("/>)', '${1}' & $sHValue & '$2')

semiono
17-11-2010, 17:13
Creat0R, спасибо! Мне этого скрипта хватит, просто надо было доделать, очень нужно было позарез.
XML очень непроходимый, поэтому я условия не сразу учёл, и даже удивился, два текста встретились,
и оба совершенно различной структуры! При такой любви производителей к xml, и неудосужились внедрить
winapi для работы с этим в винду. :search:

Creat0R
17-11-2010, 18:48
semiono,
Тема решена?

semiono
17-11-2010, 19:53
Тема решена. :(
Мне стыдно, я вдруг вспомнил это я сам коментарии писал давно очень и забыл:
<!-- ArrangeWindow -->
<!-- Event Image --> итп. это действительно были коменты, причём от меня ))

Структура файла:
...
<item>
<string name="Group" value="PArrangeWindow"/>
...
<obj class="UPoint" name="Location" ID="182867016">
<int name="H" value="0"/>
<int name="V" value="0"/>
</obj>
...
<obj class="UPoint" name="Size" ID="182564128">
<int name="H" value="1132"/>
<int name="V" value="732"/>
</obj>
...
</item>
...
Но уже тему закрою, сам виноват, надо было вовремя разбираться.




© OSzone.net 2001-2012