Что нового

[Автоматизация] <xml> установить значения в файле.

semiono

Новичок
Сообщения
18
Репутация
0
Структура XML файла:
...
<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>
...

Нужно установить значения H и V равными @DesktopWidth и @DesktopHeigh
значение ID игнорировать, оно переменное.
Файл относительно длинный, поэтому желательно попасть в нужную секцию,
ориентировочно как я выделил.

Можно использовать _XMLDomWrapper, только я не знаю как.
 
Автор
S

semiono

Новичок
Сообщения
18
Репутация
0
А мою тему просто не читают, или что-то не так?
Помогите с регэкпами?
(Найти ...'PArrangeWindow'... & ...'Location'... & ...'Size'...) и (заменить "H" value=" & @DesktopHeigh )
:-\
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
semiono [?]
(Найти ...'PArrangeWindow'... & ...'Location'... & ...'Size'...) и (заменить "H" value=" & @DesktopHeigh )

Если я правильно задачу то :
Код:
$sPattern='(?s)(.+?PArrangeWindow.+?Size.+?H" value=")\d+?("/>.+?V" value=")\d+?("/>.+</item>.+?)'
;$sRez=StringRegExpReplace($sText,$sPattern, "\1" & @DesktopWidth & "\2" & @DesktopHeight & "\3")
$sRez=StringRegExpReplace($sText,$sPattern,'${1}' & @DesktopWidth & '${2}' & @DesktopHeight & '${3}') ; Исправлено
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
semiono
Так у меня работает:
Код:
Opt('MustDeclareVars', 1)

Global $iEncod, $sFile = 'Test.XML', $hFile, $sText, $aText, _
		$sReplace_1 = @DesktopWidth, $sReplace_2 = @DesktopHeight, _
		$sSearchCheck = 'PArrangeWindow', $iCheck = 0, $sSearch_1 = 'name="H" value="', _
		$sSearch_2 = 'name="V" value="', $sValue_1, $sValue_2, $iNumberReplace_1 = 2, _
		$iNumberReplace_2 = 2

FileCopy(@ScriptDir & '\' & $sFile, @ScriptDir & '\1_' & $sFile, 1)
$iEncod = FileGetEncoding(@ScriptDir & '\' & $sFile)
$hFile = FileOpen(@ScriptDir & '\' & $sFile, $iEncod)
If $hFile = -1 Then
	MsgBox(16, 'Error', 'Ошибка открытия файла.')
	Exit
EndIf
$sText = FileRead($hFile)
FileClose($hFile)

$aText = StringSplit(StringStripCR($sText), @LF)

For $i = 1 To $aText[0]
	If StringInStr($aText[$i], $sSearchCheck) Then
		$iCheck = 1
	EndIf
	If $iCheck Then
		If StringInStr($aText[$i], $sSearch_1) Then
			$sValue_1 = StringRegExpReplace($aText[$i], '(?s).*?' & $sSearch_1 & '(\d+)"?.*', '\1')
			If $sValue_1 Then
				$aText[$i] = StringReplace($aText[$i], $sValue_1, $sReplace_1)
				$iNumberReplace_1 -= 1
			EndIf
		EndIf
		If StringInStr($aText[$i], $sSearch_2) Then
			$sValue_2 = StringRegExpReplace($aText[$i], '(?s).*?' & $sSearch_2 & '(\d+)"?.*', '\1')
			If $sValue_2 Then
				$aText[$i] = StringReplace($aText[$i], $sValue_2, $sReplace_2)
				$iNumberReplace_2 -= 1
			EndIf
		EndIf
		If Not $iNumberReplace_1 And Not $iNumberReplace_2 Then ExitLoop
	EndIf
Next
;$hFile = FileOpen(@ScriptDir & '\' & $sFile, $iEncod + 2)
$hFile = FileOpen(@ScriptDir & '\1-Test.XML', $iEncod + 2)
If $hFile = -1 Then
	MsgBox(16, 'Error', 'Ошибка открытия файла.')
	Exit
EndIf
For $i = 1 To $aText[0]
	If $i = $aText[0] Then
		FileWrite($hFile, $aText[$i])
	Else
		FileWrite($hFile, $aText[$i] & @CRLF)
	EndIf
Next
FileClose($hFile)
MsgBox(64, '', 'Все OK!')
 
Автор
S

semiono

Новичок
Сообщения
18
Репутация
0
gregaz, :beer:
madmasles, отличная работа! :beer:
Я ещё раз это проверю, однако сразу сравнил и точное попадание!
Но у меня вопрос, что это за копии создаются? Причём аж две 1-Test.XML и 1_Test.XML :smile:
Попробую это изменить на оригинальный файл, хотя ваш код довольно
сложный как бы не запутаться в нём. ))

И ещё если мне понадобиться правка других блоков XML, то мне какую часть кода изменить?
Я так понимаю что саму процедуру/функцию не надо два раза переписывать?
Наверное Global.... только? Хотя разберусь, не маленький! ;D
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
semiono [?]
что это за копии создаются?
Резервную копию на всякий случай делаю, вдруг какая-то ошибка вылезет и файл пропадет.
Замените у меня
Код:
;...
;$hFile = FileOpen(@ScriptDir & '\' & $sFile, $iEncod + 2)
$hFile = FileOpen(@ScriptDir & '\1-Test.XML', $iEncod + 2)
;...
;на
;...
$hFile = FileOpen(@ScriptDir & '\' & $sFile, $iEncod + 2)
;$hFile = FileOpen(@ScriptDir & '\1-Test.XML', $iEncod + 2)
;...
чтобы файл 1-Test.XML не создавался. Это от тестирования осталось.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
semiono
А решение отсюда разве не подходит?

gregaz [?]
Если я правильно задачу то
Оно работает? у меня нет. \1 & @DesktopWidth у меня равняется \11680 (1 & 1680), в таких случаях нужно использовать такую конструкцию: '${1}' & @DesktopWidth

Вот регулярка для примера в первом сообщений:

Код:
$sText = FileRead("test.xml")

$sRet = StringRegExpReplace($sText, _
	'(?si)(<obj.*name="Location".*?>.*?(?!</obj>)<int name="H" value=")\d*("/>\s*<int name="V" value=")\d*("/>)', _
	'${1}' & @DesktopWidth & '${2}' & @DesktopHeight & "${3}")

ConsoleWrite($sRet & @LF)
 
Автор
S

semiono

Новичок
Сообщения
18
Репутация
0
CreatoR, я до самого закрытия темы путался в условиях задачи, поэтому там ошибки, мои разумеется.
Вот "регулярка" - это очень кстати! Кстати, что это XMLDOM инклюд не доведут до ума, хоть бы хелп написали!? Вещь-то нужная и необходимая!
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
Оно работает? у меня нет. \1 & @DesktopWidth у меня равняется \11680 (1 & 1680), в таких случаях нужно использовать такую конструкцию: '${1}' & @DesktopWidth

Да , верно. Не учел ,что @DesktopWidth - это число
 
Автор
S

semiono

Новичок
Сообщения
18
Репутация
0
madmasles, вот не пойму зачем файл два раза надо открывать было или иначе не получилось бы?
Кстати, вот эту строку я вообще удалил :smile:
FileCopy(@ScriptDir & '\' & $sFile, @ScriptDir & '\1_' & $sFile, 1)

Есть неудобство в том, что трудно подставить другие параметры чтобы не переписывать весь код.
Было бы хорошо если программа была выполнена в виде процедуры,
чтобы только подставлять другие параметры в этот же код.

Например, $sSearchCheck = 'PArrangeWindow' - я не знаю как задать
другую строку в этом коде.

$sSearchCheck1 = 'PArrangeWindow'
$sSearchCheck2 = 'Transport'
$sSearchCheck3 = 'SoundBrowser'

Придётся весь код переписывать? Как-то это нельзя организовать?...
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
semiono [?]
$sSearchCheck = 'PArrangeWindow' - я не знаю как задать
другую строку в этом коде.

Для моего варианта можно так :
Код:
$sSearch="PArrangeWindow"
;$sSearch="Transport"
;$sSearch="SoundBrowser"

$sPattern='(?s)(.+?"\Q' & $sSearch &'\E".+?Size.+?H" value=")\d+?("/>.+?V" value=")\d+?("/>.+</item>.*?)'
$sReplace='${1}' & "-----------" & '${2}' & "++++++++++++" & '${3}'
$sRez=StringRegExpReplace($sText,$sPattern,$sReplace) ; Исправлено
MsgBox(0,'$sRez',$sRez)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
semiono
В бы прикрепили пару файлов, в которых надо что-то менять, и дали бы задание по возможным заменам. Я ведь скопировал Ваш кусок файла из первого сообщения в произвольный XML файл и с ним экспериментировал.
 
Верх