|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск <строки> в XML |
|
[решено] Поиск <строки> в XML
|
Ветеран Сообщения: 842 |
Профиль | Отправить PM | Цитировать
В файле надо найти строку, например:
<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) Файл собой представляет типичный XML Здесь мы уже решали однажды проблему, но там обошлось хитростью с IniWright. Но тут это врядли поможет. Кстати, может кто знает что за файл лежит system32\xmlparser.exe Может этим как-то можно пользоваться для такой задачи? Самое главное чуть не забыл, я именно хотел организовать побайтное сравнение, чтобы найти начало строки. И потом если начало найдено, то найти и сравнить строку итд... Иначе если с помощью ReadFile читать, то можно наткнуться на пробелы и отступы итп. Вообщем я думаю надо искть "<" и ">", а потом дополнительно парсить то что внутри. Скорость работы скрипта вообщем-то не важно. Помогите такой скрипт зделать? Или какие идеи есть ещё. |
|
------- Отправлено: 01:04, 07-11-2010 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Цитата amel27:
<gcc> <NAME> <str> <![CDATA[GNU GCC Compiler]]> </str> </NAME> <MASTER_PATH> <str> <![CDATA[C:\Program Files\mingw32]]> </str> </MASTER_PATH> </gcc> <msvctk> <NAME> <str> <![CDATA[Microsoft Visual C++ Toolkit 2003]]> </str> </NAME> <INCLUDE_DIRS> <str> <![CDATA[C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;]]> </str> </INCLUDE_DIRS> <LIBRARY_DIRS> <str> <![CDATA[C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;]]> </str> </LIBRARY_DIRS> <MASTER_PATH> <str> <![CDATA[C:\Program Files\Microsoft Visual C++ Toolkit 2003]]> </str> </MASTER_PATH> </msvctk> Здесь можно лишь сложить все теги <gcc> + <NAME> + <str> + <![CDATA[GNU GCC Compiler]]> ... + <MASTER_PATH> + <str> + <![CDATA[C:\Program Files\mingw32]]> игнорируя табуляцию и пробелы... либо удалив их либо установив свою произвольную табуляцию, чтобы отредактировать этот блок автоитом. Наверное это сложная задача, но может от того и интереснее. И тогда уже не будет непроходимых XML-ов! |
|
------- Отправлено: 20:00, 07-11-2010 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Вот так можно получить данные:
#include <_XMLDomWrapper.au3> $FILE = @ScriptDir & "\test.xml" $READ = FileRead($FILE) $iLoad = _XMLLoadXML($READ) If Not $iLoad Then Exit -1 $sPath = _XMLGetValue("/file/gcc/MASTER_PATH/str") ConsoleWrite($sPath[1] & @LF) _XMLSetValue("Test.xml", "gcc/MASTER_PATH/str", "D:\Other\mingw32") Func _XMLSetValue($sFile, $sPath, $sValue) $sRead = FileRead($sFile) $sPattern = '' $sData = '' $aSplitPath = StringSplit($sPath, '/') For $i = 1 To $aSplitPath[0] $sPattern &= '.*?<' & $aSplitPath[$i] & '>.*?' Next $sData = StringRegExpReplace($sRead, '(?si)(' & $sPattern & '\Q<![CDATA[\E).*?(\Q]]>\E).*?', '\1' & StringReplace($sValue, '\', '\\') & '\2') $hFile = FileOpen($sFile, 2) FileWrite($hFile, $sData) FileClose($hFile) EndFunc |
------- Отправлено: 00:26, 08-11-2010 | #12 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать semiono, как-то так:
$sFile = "1.xml" $sText = FileRead($sFile) $sRExp = '(?ims)('& _ '(?>^\s*+<gcc>).*?'& _ '(?>^\s*+<MASTER_PATH>).*?'& _ '(?>^\s*+<str>).*?'& _ '(?>^\s*+<!\[CDATA\[))' & '([^]]*+)' & '(.*?'& _ '(?>^\s*+</gcc>)'& ')' $sText = StringRegExpReplace($sText, $sRExp, "$1D:\\Other\\mingw32$3") If @extended Then $hFile =FileOpen($sFile,2) FileWrite($hFile,$sText) FileClose($hFile) EndIf |
Отправлено: 05:43, 08-11-2010 | #13 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать amel27, невозможно использовать переменные, sRExp удаляет слеши в пути:
$sText = StringRegExpReplace($sText, $sRExp, "$1"& @ProgramFilesDir &"\\mingw32$3") А без переменных ничего хорошего не напишешь, надо что-то придумать тут! Я в паттернах не шарю, сам не смогу поправить. Кстати, не очень понятно зачем надо \ фильтровать, ведь в шаблоне файла только прямые / слеши? Или это фитча в StringRegExpReplace() |
------- Отправлено: 16:29, 11-11-2010 | #14 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 18:43, 11-11-2010 | #15 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
А вот сейчас хороший вариант! Ой, стоп! Я не понял, я думал это не рабочий пример... Цитата Creat0R:
|
||
------- Отправлено: 19:21, 11-11-2010 | #16 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Я извиняюсь, вот ещё один пример реальный надо доделать. И тему можно закрыть.
<bcc> <NAME> <str> <![CDATA[Borland C++ Compiler (5.5, 5.82)]]> </str> </NAME> <INCLUDE_DIRS> <str> <![CDATA[C:\I\Apps\Borland\CBuilder5\include;]]> </str> </INCLUDE_DIRS> <LIBRARY_DIRS> <str> <![CDATA[C:\I\Apps\Borland\CBuilder5\lib;C:\I\Apps\Borland\CBuilder5\lib\psdk;]]> </str> </LIBRARY_DIRS> <MASTER_PATH> <str> <![CDATA[C:\I\Apps\Borland\CBuilder5]]> </str> </MASTER_PATH> </bcc> Я бы сам тупо зделал три прохождения одного блока, но наверное есть способ лучше? Должно быть так: 1. @SystemDir & "\include" 2. @SystemDir & "\lib;" & @SystemDir & "\lib\psdk" 3. @SystemDir И спасибо ещё раз!!! |
------- Отправлено: 19:43, 11-11-2010 | #17 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата semiono:
_XMLSetValue("Test.xml", "bcc/INCLUDE_DIRS/str", @SystemDir & "\include") _XMLSetValue("Test.xml", "bcc/LIBRARY_DIRS/str", @SystemDir & "\lib;" & @SystemDir & "\lib\psdk") _XMLSetValue("Test.xml", "bcc/MASTER_PATH/str", @SystemDir) |
|
------- Отправлено: 19:51, 11-11-2010 | #18 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Пример.
<!-- ArrangeWindow --> <item> <string name="Group" value="PArrangeWindow"/> <member name="Values"> <int name="ActiveContext Only" value="0"/> <int name="Auto Scroll OnOff" value="1"/> <int name="Display Format" value="0"/> <float name="Insert Time" value="0"/> <obj class="UPoint" name="Location" ID="182867016"> <int name="H" value="0"/> <int name="V" value="0"/> </obj> <int name="Manipulate Suspends AutoScroll" value="1"/> <int name="Multi TrackType" value="1"/> <int name="PPQ Linear" value="0"/> <int name="Scale Mode Film" value="3"/> <int name="Scale Mode Frames" value="3"/> <int name="Scale Mode PPQ" value="0"/> <int name="Scale Mode Samples" value="3"/> <int name="Scale Mode Seconds" value="3"/> <int name="Show Info" value="0"/> <int name="Show Inspector" value="1"/> <int name="Show Overview" value="0"/> <int name="Show Track Colors" value="1"/> <obj class="UPoint" name="Size" ID="182564128"> <int name="H" value="1132"/> <int name="V" value="732"/> </obj> <int name="Snap Mode" value="0"/> <int name="Snap State" value="1"/> <int name="Speaker Arr" value="1"/> <member name="Tool Configuration"> <int name="Select Tool" value="0"/> <int name="Range Tool" value="0"/> <int name="Split Tool" value="-1"/> <int name="Glue Tool" value="-1"/> <int name="Delete Tool" value="-1"/> <int name="Zoom Tool" value="-1"/> <int name="Mute Tool" value="-1"/> <int name="TimeWarp Tool" value="0"/> <int name="Draw Tool" value="-1"/> <int name="Curve Tool" value="0"/> <int name="Play Tool" value="0"/> <int name="Color Tool" value="-1"/> <int name="SelectedToolIndex" value="0"/> </member> <float name="Window Zoom Factor" value="0.021212121212121212"/> </member> </item> <int name="H" value="1024"/> <int name="V" value="768"/> Значения должны быть таковы - @DesktopWidth, @DesktopHeigh. Просмотрел весь файл, практически схема повторяется одна и та же. <int name="..." value="..."/> <float name="..." value="..."/> итд. Все заголовки вида <!-- ArrangeWindow --> , кажись это коментарий так пишется в XML. Мне очень нужно скрипт под этот XML. Creat0R, я не уверен пойдёт ли то, что ты написал без изменений? Func _XMLSetValue($sFile, $sPath, $sValue) ... Мне тяжело расшифровать StringRegExpReplace() паттерн, может там даже лишнее или не хватает чего? Помоги под эту задачу, покажи как должно быть? Кстати, скачал _XMLDomWrapper.au3 долго глядел в него, но без справки вообще ловить нечего. Возможно там _XMLUpdateField как-то работает с полями XML, но не ясно, что именно делать |
------- Отправлено: 15:57, 16-11-2010 | #19 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Я тут смотрю, в качестве заголовка идёт такое
<obj class="UPoint" name="Size" ID="182564128"> Однако ID="182564128" может изменяться, поэтому его значение надо игнрировать. Вобщем нужен шаблон чтобы привести к такому виду грубо говоря <!-- ArrangeWindow --> (это тоже должно быть, ато там и другие секции есть) ... начало: <obj class="UPoint" name="Size" ID="????"> <int name="H" value="@DesktopHeight"/> <int name="V" value="@DesktopWidth"/> конец: </obj> По-моему код может быть таким - Рид файл компаре стринг иф <!-- ArrangeWindow --> = 1 тогда компаре стринг итд. сравниваем строки и двигаемся вперёд. ?? |
------- Последний раз редактировалось semiono, 16-11-2010 в 16:59. Отправлено: 16:30, 16-11-2010 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|