[решено] Поиск <строки> в XML

Аватара пользователя
Creat0R

Re: [решено] Поиск <строки> в XML

Сообщение Creat0R »

Цитата amel27:



и что с этим делать?.. в первом посте было понятно что и на что менять
[решено] Поиск <строки> в XML




Сейчас попытаюсь реальный пример показать, может быть не самый удачный, но навскидку...





Код:

Код: Выделить всё

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



Здесь можно лишь сложить все теги + + + ...

+ + +

игнорируя табуляцию и пробелы... либо удалив их либо установив свою произвольную табуляцию, чтобы отредактировать этот блок автоитом. Наверное это сложная задача, но может от того и интереснее. И тогда уже не будет непроходимых XML-ов!

Изображение
Аватара пользователя
Creat0R

Re: [решено] Поиск <строки> в XML

Сообщение Creat0R »

Вот так можно получить данные:





Код:

Код: Выделить всё

#include 
$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 &= '.*?.*?'
    Next
    $sData = StringRegExpReplace($sRead, '(?si)(' & $sPattern & '\Q\E).*?', '\1' & StringReplace($sValue, '\', '\\') & '\2')
    $hFile = FileOpen($sFile, 2)
    FileWrite($hFile, $sData)
    FileClose($hFile)
EndFunc
Аватара пользователя
amel27

Re: [решено] Поиск <строки> в XML

Сообщение amel27 »

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 нужен полный файл, а не его кусок
Аватара пользователя
semiono

Re: [решено] Поиск <строки> в XML

Сообщение semiono »

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



$sText = StringRegExpReplace($sText, $sRExp, "$1"& @ProgramFilesDir &"\\mingw32$3")

А без переменных ничего хорошего не напишешь, надо что-то придумать тут!

Я в паттернах не шарю, сам не смогу поправить.

Кстати, не очень понятно зачем надо \ фильтровать, ведь в шаблоне файла только прямые / слеши?

Или это фитча в StringRegExpReplace()
Аватара пользователя
Creat0R

Re: [решено] Поиск <строки> в XML

Сообщение Creat0R »

Цитата semiono:



надо что-то придумать тут!
[решено] Поиск <строки> в XML




То что “я придумал” в своём сообщений не подходит?





Код:

Код: Выделить всё

$sText = StringRegExpReplace($sText, $sRExp, "$1"& StringReplace(@ProgramFilesDir, "\", "\\") &"\\mingw32$3")
Аватара пользователя
semiono

Re: [решено] Поиск <строки> в XML

Сообщение semiono »

Цитата Creat0R:



записать обратно с этой библиотекой мне пока не удалось,
[решено] Поиск <строки> в XML




Я не стал доделывать то что не удалось, уж мне-то тем более не удалось бы.

А вот сейчас хороший вариант! Изображение



Ой, стоп! Я не понял, я думал это не рабочий пример...


Цитата Creat0R:



поэтому вот пример с парсированием строк:
[решено] Поиск <строки> в XML




Блин, я не сообразил. Я тугодум Изображение
Аватара пользователя
semiono

Re: [решено] Поиск <строки> в XML

Сообщение semiono »

Я извиняюсь, вот ещё один пример реальный надо доделать. И тему можно закрыть.



Код:

Код: Выделить всё

<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>

Я боюсь испортить скрипт, тут в блоке сразу аж три строки.

Я бы сам тупо зделал три прохождения одного блока, но наверное есть способ лучше?



Должно быть так:[/i]

1. @SystemDir & "\include"

2. @SystemDir & "\lib;" & @SystemDir & "\lib\psdk"

3. @SystemDir





И спасибо ещё раз!!!
Аватара пользователя
Creat0R

Re: [решено] Поиск <строки> в XML

Сообщение Creat0R »

Цитата semiono:



Я боюсь испортить скрипт
[решено] Поиск <строки> в XML




А что там портить, используй функцию по назначению:





Код:

Код: Выделить всё

_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)
Аватара пользователя
semiono

Re: [решено] Поиск <строки> в XML

Сообщение semiono »

Пример.



Код:

Код: Выделить всё

<!-- 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"









Значения должны быть таковы - @DesktopWidth, @DesktopHeigh.

Просмотрел весь файл, практически схема повторяется одна и та же.





итд.



Все заголовки вида , кажись это коментарий так пишется в XML.



Мне очень нужно скрипт под этот XML. Изображение



Creat0R, я не уверен пойдёт ли то, что ты написал без изменений?

Func _XMLSetValue($sFile, $sPath, $sValue)

...



Мне тяжело расшифровать StringRegExpReplace() паттерн, может там даже лишнее или не хватает чего?

Помоги под эту задачу, покажи как должно быть?



Кстати, скачал _XMLDomWrapper.au3 долго глядел в него, но без справки вообще ловить нечего.

Возможно там _XMLUpdateField как-то работает с полями XML, но не ясно, что именно делать Изображение
Аватара пользователя
semiono

Re: [решено] Поиск <строки> в XML

Сообщение semiono »

Я тут смотрю, в качестве заголовка идёт такое



Однако ID="182564128" может изменяться, поэтому его значение надо игнрировать.



Вобщем нужен шаблон чтобы привести к такому виду грубо говоря



(это тоже должно быть, ато там и другие секции есть)

...

начало:

@DesktopHeight"/>



конец:






По-моему код может быть таким -

Рид файл

компаре стринг

иф = 1

тогда

компаре стринг

итд.

сравниваем строки и двигаемся вперёд. ??



Изображение
Ответить

Вернуться в «AutoIt»