Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск <строки> в XML

Ответить
Настройки темы
[решено] Поиск <строки> в XML

Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Изменения
Автор: semiono
Дата: 07-11-2010
В файле надо найти строку, например:
<WIDTH int="800" />
и заменить её на
<WIDTH int="1024" />
Но лучше найти с неизвестным значением.
Я думаю здесь можно пропарсить по открытию тега "<" плюс имя "WIDTH int="
и собственно по закрытию /> И перезаписать найденный шаблон строки.

Нечто такое, только без ошибок можно?
Код: Выделить весь код
$file = FileOpen("C:\I\WinSxS\Process\Application Data\codeblocks\default.conf",0)
$i = 0
While $i <> 1
	FileSetPos($file,$i,0)
	$i = $i + 1
	$str = FileRead($file,1)
	If StringCompare($str,"<",0) then MsgBox(0,"",$str,"","")
WEnd
FileClose($file)
я тут начал побайтно искать "<" только в качестве примера... искать надо конечно же <WIDTH int="
Файл собой представляет типичный XML

Здесь мы уже решали однажды проблему, но там обошлось хитростью с IniWright. Но тут это врядли поможет.
Кстати, может кто знает что за файл лежит system32\xmlparser.exe
Может этим как-то можно пользоваться для такой задачи?


Самое главное чуть не забыл, я именно хотел организовать побайтное сравнение, чтобы найти начало строки.
И потом если начало найдено, то найти и сравнить строку итд...
Иначе если с помощью ReadFile читать, то можно наткнуться на пробелы и отступы итп.
Вообщем я думаю надо искть "<" и ">", а потом дополнительно парсить то что внутри.
Скорость работы скрипта вообщем-то не важно. Помогите такой скрипт зделать? Или какие идеи есть ещё.

-------
Полезное сообщение


Отправлено: 01:04, 07-11-2010

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата semiono:
пойдёт ли то, что ты написал без изменений? »
Нет, это уже специфичная задача.

Код: Выделить весь код
$sFile = @DesktopDir & "\Test.xml"
$sHValue = @DesktopWidth
$sVValue = @DesktopHeight

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

$hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sData)
FileClose($hFile)

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:11, 16-11-2010 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Большое спасибо!
А глобальный заголовок проверить?

<!-- 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 как-то?

Цитата Creat0R:
Нет, это уже специфичная задача. »
Я бы сказал даже отвратительно запутанная.

-------
Полезное сообщение


Отправлено: 23:53, 16-11-2010 | #22


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


$sData = FileRead($sFile)
If StringInStr($sData, "<!-- ArrangeWindow -->") <> 0 Then
$sData = StringRegExpReplace(...

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

-------
Полезное сообщение


Отправлено: 00:18, 17-11-2010 | #23


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата semiono:
наверное не совсем правильно? »
Почему нет, если оно должно присутствовать в файле, значит видимо проверка не лишняя.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:32, 17-11-2010 | #24


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Нет, не работает.

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

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

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

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

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

-------
Полезное сообщение


Отправлено: 01:00, 17-11-2010 | #25


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

Код: Выделить весь код
$sData = StringRegExpReplace($sData, '(?si)(<!-- ArrangeWindow -->.*?<obj.*name="Location".*?>.*?(?!</obj>)<int name="H" value=")\d*("/>)', '${1}' & $sHValue & '$2')

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 17-11-2010 | #26


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


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

-------
Полезное сообщение


Отправлено: 17:13, 17-11-2010 | #27


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


semiono,
Тема решена?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 18:48, 17-11-2010 | #28


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Тема решена.
Мне стыдно, я вдруг вспомнил это я сам коментарии писал давно очень и забыл:
<!-- 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>
...
Но уже тему закрою, сам виноват, надо было вовремя разбираться.

-------
Полезное сообщение


Последний раз редактировалось semiono, 17-11-2010 в 20:34.


Отправлено: 19:53, 17-11-2010 | #29



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск <строки> в XML

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск строки в значени ключа реестра. user_123 Скриптовые языки администрирования Windows 14 27-11-2014 18:07
[решено] поиск строки в WORD файле.... garanov AutoIt 3 19-03-2010 09:16
[решено] проверка XML-файла на соответствие XML schema в IE 6 и Firefox 2 dimait Вебмастеру 4 23-08-2007 02:02
Поиск в яндекс.xml (выделено из "Зацените сайт!") Vampire Вебмастеру 21 11-09-2006 20:31
Решено | XML. DOM. Поиск дочерних элементов. penykov Программирование и базы данных 3 27-04-2006 15:46




 
Переход