Что нового

[Данные, строки] Оповещение при изменении xml документа.

maddoc

Новичок
Сообщения
48
Репутация
2
Добрый.
Что-то все подзабыл )
Если добрый человек подскажет как распарсить хмл документ вот такого вида :
Код:
<?xml version="1.0" encoding="UTF-8"?><list>
<lot id="18781">
    <server>Вечная песня - Орда</server>
    <shop>Sho109</shop>
    <gold>3000</gold>
    <cost>14.1</cost>
</lot>
<lot id="18785">
    <server>Азурегос - Орда</server>
    <shop>TEST-FAKE-LOTS</shop>
    <gold>5000</gold>
    <cost>14.1</cost>
</lot>
</list>


И при появлении новых данных ( <lot id="18788"> например) делать что-то.
Так-же как вытащить данные с этого "лота?"

Грубо говоря нам нужно агриться на Лот ID , если он новый и заодно парсить все остальные данные, но агрится на них не стоит. )
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение общих правил (пункт В.8):
Так как эта конференция называется "Русское сообщество AutoIt", язык общения на ней - Русский. Названия фирм или программных продуктов, аббревиатуры и т.д. должны быть написаны так, как они пишутся в оригинале, например не следует писать УСБ вместо USB. На форуме крайне не рекомендуется намеренно искажать русский язык и использовать "сетевой жаргон" на подобии "Аффтар выпей йадау!".


С уважением, ваш Модератор.





Я не понимаю что такое агриться.
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
С-агриться = сработать триггрер должен = случай при котором скрипт должен что-то сказать.


Добавлено:
Сообщение автоматически объединено:

Вообщем задача на вид простая а на деле часов 5 пытаюсь допереть как нормально сделать.
Сначала нам нужно парсить <lot id=" ">
Потом нам нужно сверить его с чем-то, не важно с чем уже дело 10е.
Потом, если сверка вернула уникальность, нужно распарсить все остальное в контейнере.
Короче я закипаю....
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Можно сверять количество символов в файле.
К примеру, в xml файле с 1 поста - 335 символов и если при проверке их больше то делать какое-то действие:
Код:
While 1
	If StringLen(FileRead(@ScriptDir & '\test.xml')) > 335 Then ExitLoop MsgBox(0, '', '')
WEnd
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
отпадает.
Еще раз : Нужно узнать что находится внутри контейнера <lot id =
В этом самая сложная задача так как ID нужно проверить на уникальность - если его уже парсили, то пропустить весь контейнер.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А так ?:
Код:
While 1
	$FileRead = FileRead(@ScriptDir & '\test.xml')
	$Reg = StringRegExp($FileRead, '<lot id="(.*?)">', 3)
	If UBound($Reg) > 2 Then ExitLoop MsgBox(0, '', '')
WEnd
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
пробую по другому... отпишусь если получится
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
Решил проблему чтения и сравнения. Теперь другая проблема. Помимо того, что ID лота должен быть уникален (это решил) нужно еще и как то сравнить значение <server> = и вот если оно совпало с настройками в ини файле - тогда вернуть true


Код:
#RequireAdmin
#include <Array.au3>
$file = "get-lots.xml"
Global $sLot, $sServer, $sShop, $sGold, $sCost, $sLotAmount
Global $avArray[100]

InetGet("http://gexdex.ru/script/exchange/get-lots/get-lots.xml","get-lots.xml", 0)
GetLotsInfo()
PrintLots()


Func PrintLots()
Local $i = 0
Do

If $sLot[$i] = $avArray[$i] Then
ConsoleWrite("same " & @CRLF)
Else
ConsoleWrite("var= " & $sLot[$i] & @CRLF)
ConsoleWrite("var= " & $sServer[$i] & @CRLF)
ConsoleWrite("var= " & $sShop[$i] & @CRLF)
ConsoleWrite("var= " & $sGold[$i] & @CRLF)
ConsoleWrite("var= " & $sCost[$i] & @CRLF)

EndIf

$avArray[$i] = $sLot[$i]
$i = $i + 1
Until $i = $sLotAmount

EndFunc


Func GetLotsInfo()

sleep(1000)
If @error Then
	MsgBox(4096, "Pars", "Cant download http://gexdex.ru/script/exchange/get-lots/get-lots.xml", 0)
EndIf
Local $iEncoding
Local $sFind
Local $hFile = FileOpen($file)
Local $sBuf = FileRead($hFile)
$sFindLot = '<lot id="(.+?)">' ;шаблон для поиска <relog_servername>Ясеневый лес</relog_servername>
$sFindServer = '<server>(.+?)</server>'
$sFindShop = '<shop>(.+?)</shop>'
$sFindGold = '<gold>(.+?)</gold>'
$sFindCost = '<cost>(.+?)</cost>'
$sLot =    StringRegExp($sBuf, $sFindLot, 3)
$sServer = StringRegExp($sBuf, $sFindServer, 3)
$sShop =   StringRegExp($sBuf, $sFindShop, 3)
$sGold =   StringRegExp($sBuf, $sFindGold, 3)
$sCost =   StringRegExp($sBuf, $sFindCost, 3)
$sLotAmount = UBound($sLot) ; count lots amount
FileClose($hFile)
EndFunc




Как произвести поиск в двухмерном массиве ( он будет генеритца из ини файла, со значением ключа ) , и узнать с каким ключем записанно значение в нем?

Ака :
У нас будет аррай :
Array[Server1][True]
Array[Server2][Fasle]
Array[Server3][Fasle]
Array[Server4][Fasle]
Array[Server5][Fasle]

И у нас будет :
Server = Server[0]

Нам нужно в первом массиве произвести поиск, и узнать с каким ключем записан наш сервер.
 
Верх