Что нового

[Автоматизация] Как найти сторку по двум параметрам

StarEdik

Новичок
Сообщения
365
Репутация
4
Здравствуйте!!!
Прошу помощи. В текстовом файле между тегами <item и </item>, имеются строки с разными значениями, среди которых нужно найти нужные нам строки по двум параметрам.
Параметр1=' price="40" '
Параметр2='Tala'
Найденные совпадении нужно сохранит в текстовом файле.(с тегами).

Пример тега
Код:
<item id="40873" price="40" state="2" name="Tala" customItemId="194226357"> 

<![CDATA[[{48.2,c:8015921}]]]> 
 
</item>
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Код:
Global $sXmlPath, $oXml, $sNodes, $hFile

$sXmlPath = @ScriptDir&'\qwer.xml' ; путь к исходному XML файлу
If Not FileExists($sXmlPath) Then
	MsgBox(16, "error", "File not exists")
	Exit
EndIf

$oXml = ObjCreate('MSXML2.DomDocument.3.0')
If Not IsObj($oXml) Then
	MsgBox(16, 'Ошибка', 'MsXML 3.0 не установлен.')
	Exit 1
EndIf
$oXml.async = 0
$oXml.load($sXmlPath)
$sNodes = $oXml.selectNodes('//item')
$hFile = FileOpen(@ScriptDir&"\results.xml", 1)
If $hFile = -1 Then Exit 2
If IsObj($sNodes) Then
For $oNode In $sNodes
If $oNode.getAttribute('price') == "40" And $oNode.getAttribute('name') == "Tala" Then
	MsgBox(0, "xml node text", $oNode.xml)
	FileWrite($hFile, $oNode.xml)
EndIf
Next
EndIf
FileClose($hFile)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
alex33
Спасибо. Но ваш скрипт возврашает пустой файл. Данные у меня на txt файле. Сохранил как xml, но ...
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Не знаю, у меня всё работает... А в окошко MSGBox что-нибудь выводится?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
#include 'array.au3'

$file=FileRead(@ScriptDir&'\qwer.xml')

$pattern = '(?s)<item[^>]*?price="40"[^>]*?name="Tala".*?</item>'

$str=StringRegExp($file, $pattern, 3)
_ArrayDisplay($str)


Так?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
C2H5OH
:smile: Да, так. Но ;
Если CDATA длиннее - 5100 знаков, то стока обрезается с конца, остается 3600-3700. А всего в файле до двух млн знаков имеется. Отличный скорост выполнения поиска .
И еще, начиная с 6 иногда с 11, 13..., результата, в не которых случаях, тег полностью не захватывается. :(

Код:
<![CDATA[[{48.2,c:8015921...........................5100 символ....................................................}]]]>
------------------------------------------------------------------------------------------------------------------------
<item id="40873" price="40" state="2" name="Tala" customItemId="194226357"> 

<![CDATA[[{48.2,c:8015

</item>
------------------------------------------------------------------------------------------------------------------------
<item id="40873" price="40" state="2" name="Tala" customItemId="194226357"> 

<![CDATA[[{48.2,c:.....3708символ ..

------------------------------------------------------------------------------------------------------------------------
<item id="40873" price="40" state="2" name="Tala" customItemId="194226357"> 

<![CDATA[[{48.2,c:...........3680 символ..
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
inververs

Так это _ArrayDisplay обрезает, не пользуйтесь ей.
похоже

Код:
#include 'array.au3'

$file=FileRead(@ScriptDir&'\qwer.xml')

$pattern = '(?s)<item[^>]*?price="40"[^>]*?name="Tala".*?</item>'

$str=StringRegExp($file, $pattern, 3)
;_ArrayDisplay($str)

$sResult = _ArrayToString($str, @CRLF)

$hFile = FileOpen("Tala_2.txt", 2)

FileWrite($hFile, $sResult)

FileClose($hFile)
 
Верх