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

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

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

Аватара для semiono

Ветеран


Сообщения: 830
Благодарности: 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

 

Аватара для semiono

Ветеран


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

Профиль | Отправить 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> < /gcc> и <msvctk>< /msvctk>, и хотелось бы пробраться к MASTER_PATH первого кампилятора, то-есть иметь возможность указать путь <![CDATA[C:\Program Files\mingw32]]> допустим на D:\Other\mingw32

Здесь можно лишь сложить все теги <gcc> + <NAME> + <str> + <![CDATA[GNU GCC Compiler]]> ...
+ <MASTER_PATH> + <str> + <![CDATA[C:\Program Files\mingw32]]>
игнорируя табуляцию и пробелы... либо удалив их либо установив свою произвольную табуляцию, чтобы отредактировать этот блок автоитом. Наверное это сложная задача, но может от того и интереснее. И тогда уже не будет непроходимых XML-ов!

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


Отправлено: 20:00, 07-11-2010 | #11



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

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


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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

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

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

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:26, 08-11-2010 | #12


Googler


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

Профиль | Отправить 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
всё-таки для работы с DOM нужен полный файл, а не его кусок
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:43, 08-11-2010 | #13


Аватара для semiono

Ветеран


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

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


amel27, невозможно использовать переменные, sRExp удаляет слеши в пути:

$sText = StringRegExpReplace($sText, $sRExp, "$1"& @ProgramFilesDir &"\\mingw32$3")
А без переменных ничего хорошего не напишешь, надо что-то придумать тут!
Я в паттернах не шарю, сам не смогу поправить.
Кстати, не очень понятно зачем надо \ фильтровать, ведь в шаблоне файла только прямые / слеши?
Или это фитча в StringRegExpReplace()

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


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


Аватара для Creat0R

Must AutoIt


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

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


Цитата semiono:
надо что-то придумать тут! »
То что “я придумал” в своём сообщений не подходит?

Код: Выделить весь код
$sText = StringRegExpReplace($sText, $sRExp, "$1"& StringReplace(@ProgramFilesDir, "\", "\\") &"\\mingw32$3")

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

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

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:43, 11-11-2010 | #15


Аватара для semiono

Ветеран


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

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


Цитата Creat0R:
записать обратно с этой библиотекой мне пока не удалось, »
Я не стал доделывать то что не удалось, уж мне-то тем более не удалось бы.
А вот сейчас хороший вариант!

Ой, стоп! Я не понял, я думал это не рабочий пример...
Цитата Creat0R:
поэтому вот пример с парсированием строк: »
Блин, я не сообразил. Я тугодум

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


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


Аватара для semiono

Ветеран


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

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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)

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

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

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

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

Отправлено: 19:51, 11-11-2010 | #18


Аватара для semiono

Ветеран


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

Профиль | Отправить 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>
Здесь нужно установить значения для "H" и для "V"

<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


Аватара для semiono

Ветеран


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

Профиль | Отправить 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



Компьютерный форум 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




 
Переход