XML должен заканчиваться тегом </feed>, то его корневой блок. Кроме того я сравниваю конец XML-ля в снифере и в hiasm.
------------ Дoбавленo в 00.31:
Снифер, почему-то никогда не ошибается.
------------ Дoбавленo в 00.34:
nesco, с момощью костылей я получил 100% рабочую схему. отработало 50 из 50-ти без ошибок. Щас скину.
------------ Дoбавленo в 00.35:
Добавил "избыточную" кешируемость:
Add(MultiElementEx,15245682,252,168) { @Hint=#27:Получить XML по всем видео!| @Color=43690 AddHint(-72,-71,167,13,@Hint) } BEGIN_SDK Add(EditMultiEx,800280,21,21) { WorkCount=#8:doString| EventCount=#15:onLength1=onEnd|0:| Width=1679 Height=767 link(doString,6872508:doString,[(45,27)(45,146)]) } Add(Hub,12509480,539,140) { OutCount=7 link(onEvent2,15958911:In,[(572,153)(572,125)]) link(onEvent3,8022212:doWork2,[(740,160)(740,132)]) link(onEvent4,1560143:doStop,[(626,167)(626,230)]) link(onEvent6,8281024:doOpen,[]) link(onEvent7,8281024:doSend,[(567,188)(567,195)]) } Add(TCP_Client,8281024,581,175) { Port=80 Point(onError) PColor(onDisconnect,11184810) link(onRead,169976:doEvent1,[]) link(IP,602540:Value,[(587,157)(417,157)(417,180)(384,180)]) link(Data,12434424:Var,[]) } Add(Host,13992201,329,133) { link(onIPByHost,602540:doValue,[]) link(HostName,5590300:Value,[]) } Add(Memory,5590300,336,91) { Default=String(gdata.youtube.com) } Add(Memory,602540,378,140) { Default=String(www.google.com) link(onData,4228338:doData,[]) } Add(GlobalVar,15729024,133,70) { Name="Auth" } Add(FormatStr,6872508,133,140) { DataCount=3 Mask="GET /feeds/api/users/default/uploads HTTP/1.1 Host: gdata.youtube.com Content-Type: application/atom+xml Authorization: GoogleLogin auth=%1 GData-Version: 2 X-GData-Client: %2 X-GData-Key: key=%3
" Point(FString) link(onFString,13992201:doIPByHost,[]) link(Str1,15729024:Var,[]) link(Str2,9080111:Var,[(146,116)(125,116)]) link(Str3,13209877:Var,[(153,117)(174,117)]) } Add(LineBreak,16088136,133,182) { Caption="Data" Type=1 link(Data,6872508:FString,[]) Primary=[12434424,455,-42] } Add(GlobalVar,9080111,119,49) { Name="name_program" } Add(GlobalVar,13209877,168,28) { Name="programmer_key" } Add(StrCat,8029442,770,119) { Point(doClear) link(Str1,4232550:Var1,[(776,106)(814,106)(814,159)]) } Add(StrCat,4049894,770,182) { Str2=" " Point(doClear) link(onStrCat,8548926:doEvent1,[]) link(Str1,4232550:Var2,[]) } Add(Hub,8548926,812,182) { link(onEvent1,11742242:doEvent1,[]) link(onEvent2,8022212:doWork3,[(833,195)(833,220)(758,220)]) } Add(GetDataEx,4232550,770,154) { link(Data,8029442:Result,[]) } Add(Hub,169976,637,175) { link(onEvent1,8029442:doStrCat,[(667,181)(667,125)]) link(onEvent2,1560143:doSearch,[(668,188)(668,223)]) } Add(LineBreak,6328839,700,189) { link(Out,4049894:doClear,[]) Primary=[15958911,-112,-70] } Add(HubEx,8022212,754,126) { link(onEvent,8029442:doClear,[]) } Add(DoData,4228338,448,140) { Data=String() link(onEventData,12509480:doEvent1,[]) } Add(StrList,16481994,1386,182) { link(FileName,2401908:FString,[(1399,166)(1441,166)]) } Add(Counter,12472518,1386,119) { link(onNext,2401908:doString,[]) } Add(Hub,6106760,1323,182) { OutCount=4 link(onEvent1,12472518:doNext,[(1358,188)(1358,125)]) link(onEvent2,16481994:doClear,[]) link(onEvent3,16481994:doText,[(1361,202)(1361,209)]) link(onEvent4,16481994:doSave,[(1354,209)(1354,223)]) } Add(FormatStr,2401908,1435,119) { Mask="C:\log\%1.txt" Point(FString) } Add(MultiElementEx,11156933,1106,182) { @Hint=#23:Декодер цепочных блоков| link(onOutput,9509036:doEvent1,[]) link(onNotChunk,15412616:doWork2,[(1162,195)(1162,335)]) link(onEvent3,6570675:doWork1,[(1147,202)(1147,257)(947,257)]) link(Data,1853942:Value,[(1112,170)(1038,170)(1038,227)(1000,227)]) AddHint(60,-52,150,13,@Hint) } BEGIN_SDK Add(EditMultiEx,9218302,21,21) { WorkCount=#5:Input|7:PopData| EventCount=#8:onOutput|10:onNotChunk|8:onEvent3| DataCount=#4:Data| Width=1287 Height=494 VOffset=343 HOffset=91 link(Input,1716261:doAdd,[(43,370)(43,265)]) link(PopData,3547378:doData,[]) } Add(Hub,5160054,1057,364) { OutCount=3 link(onEvent1,8505099:doData,[]) link(onEvent2,8101622:doReset,[(1089,377)(1089,426)(374,426)(374,237)]) link(onEvent3,9218302:onEvent3,[]) } Add(BlockFind,13296706,266,266) { @Hint=#15:Поиск заголовка| @Color=9360639 Delete=0 StartBlock="HTTP" EndBlock="13101310" link(onSearch,13542008:doSearch,[(306,272)(306,146)]) link(onEndSearch,1835341:doEvent,[]) AddHint(-8,-52,103,13,@Hint) } Add(InfoTip,10771330,245,56) { Info=#30:Блок обработки цепочных блоков| Font=[MS Sans Serif,8,1,0,1] Frame=3 Width=1037 Height=424 Margin=10 } Add(DataToFile,405781,735,280) { @Hint=#30:Считываем длину текущего блока| Type=7 link(onGet,13148707:doEvent1,[]) link(Stream,2242998:Var2,[]) AddHint(-56,57,188,13,@Hint) } Add(MemoryStream,15414165,553,147) { @Hint=#25:Главный накопитель потока| Point(doPosition) Point(Position) AddHint(-143,-32,159,13,@Hint) } Add(IndexToChanel,1835341,406,273) { @Hint=#18:Коммутатор потоков| Point(Index) link(onEvent2,3620042:doReplace,[]) link(Index,8101622:State,[]) AddHint(52,-29,121,13,@Hint) } Add(Hub,15047654,371,140) { OutCount=4 link(onEvent1,14672193:doClear,[(395,146)(395,107)(1204,107)(1204,307)]) link(onEvent2,280953:doClear,[(525,153)(525,146)]) link(onEvent3,15414165:doClear,[]) link(onEvent4,8101622:doOn,[(395,167)(395,244)]) } Add(Switch,8101622,406,224) { @Hint=#128:Переключатель коммутатора потоков. Если поймали начало нового цикла, то переключаемся на накопление и обработку потоковых данных| DataOn=Integer(1) DataOff=Integer(0) Point(State) Point(doOn) AddHint(-153,90,198,65,@Hint) } Add(Convertor,4846764,819,287) { @Hint=#34:Переводим длину блока из HEX в DEC| Mode=5 link(onResult,13652235:doValue,[]) AddHint(-69,-56,190,26,@Hint) } Add(StreamCopy,2003248,553,280) { @Color=9360639 Count=-1 link(onCopy,10493831:doEvent1,[]) link(Dest,15562255:Var2,[]) } Add(Hub,10493831,609,280) { InCount=2 OutCount=3 link(onEvent1,9519320:doData,[(641,286)(641,251)]) link(onEvent2,405781:doGet,[]) link(onEvent3,5192092:doData,[]) } Add(GetDataEx,15562255,553,217) { link(Data,15414165:Stream,[]) } Add(DoData,9519320,672,245) { @Hint=#66:Перемещаем указатель в главном накопителе на начало текущего блока| Data=Integer(0) link(onEventData,14363307:doWork2,[]) link(Data,280953:Value,[]) AddHint(-232,-53,197,26,@Hint) } Add(Memory,280953,672,133) { @Hint=#41:Хранилище указателя начала текущего блока| Default=Integer(0) Point(Data) link(Data,15414165:Position,[(678,121)(626,121)(626,191)(573,191)]) AddHint(-210,-64,169,26,@Hint) } Add(Hub,13148707,784,280) { link(onEvent1,3613939:doClear,[(811,286)(811,160)]) link(onEvent2,4846764:doConvert,[]) } Add(Memory,13652235,861,287) { link(onData,13903680:doCompare,[]) } Add(StreamCopy,2674035,959,287) { @Color=9360639 Count=-1 link(onCopy,2723286:doCompare,[]) link(Dest,13521530:Var2,[]) link(Source,9628397:Var2,[]) link(Count,16364596:Var2,[]) } Add(MemoryStream,3613939,959,147) { @Hint=#20:Буфер текущего блока| Point(doPosition) Point(Position) AddHint(71,-24,131,13,@Hint) } Add(GetDataEx,2242998,735,217) { Angle=3 link(Data,15562255:Var3,[]) } Add(If_else,2723286,1008,287) { @Hint=#144:Если считанная длина блока не равна нужной, то ждем следующих данных. Если равна, то переходим к накоплению текста и переходу к следующему блоку| link(onTrue,16326683:doEvent1,[]) link(Op1,16364596:Var3,[(1014,271)]) AddHint(63,-138,188,65,@Hint) } Add(Hub,16326683,1057,287) { OutCount=5 link(onEvent1,405418:doData,[(1089,293)(1089,201)(889,201)(889,167)]) link(onEvent2,11205451:doConvert,[]) link(onEvent3,4428523:doGet,[(1106,307)(1106,335)]) link(onEvent4,280953:doValue,[(1098,314)(1098,114)(660,114)(660,139)]) link(onEvent5,10493831:doEvent2,[(1089,321)(1089,359)(594,359)(594,293)]) } Add(DoData,405418,903,161) { @Hint=#44:Перемещаем указатель буфера на начало данных| Data=Integer(0) link(onEventData,3613939:doPosition,[]) AddHint(35,-89,197,26,@Hint) } Add(GetDataEx,13521530,959,182) { link(Data,3613939:Stream,[]) } Add(DoData,5192092,651,294) { @Hint=#89:Возвращаем указатель в конец главного накопителя, для возможности добавления новых данных| Data=Integer(0) link(onEventData,14363307:doWork3,[(718,300)]) link(Data,15414165:Size,[(657,203)(566,203)]) AddHint(-166,72,181,52,@Hint) } Add(HubEx,14363307,714,245) { Angle=3 link(onEvent,15414165:doPosition,[(718,208)(541,208)(541,167)]) } Add(DataToFile,4428523,1120,322) { @Hint=#174:В конце каждого блока есть перевод строки, который не попадает в счетчик. Перемещаем указатель за него к началу следующего блока. После чего, сохраняем указатель в хранилище | Type=7 link(Stream,9628397:Var3,[(1126,222)]) AddHint(-213,63,197,78,@Hint) } Add(GetDataEx,9628397,966,217) { Angle=3 link(Data,2242998:Var3,[]) } Add(Replace,3620042,455,280) { @Hint=#60:Приводим к UNIX-формату перевода строк, оставляем только #13| SubStr="10" link(onReplace,7706637:doConvert,[]) AddHint(-183,146,182,39,@Hint) } Add(If_else,13903680,903,287) { @Hint=#66:Если длина блока равна нулю, то заканчиваем операцию чтения блоков| Type=5 Op2=Integer(0) link(onTrue,2674035:doCopy,[]) link(onFalse,5160054:doEvent1,[(947,300)(947,370)]) AddHint(-208,78,196,26,@Hint) } Add(StrCat,14672193,1218,294) { @Hint=#20:Строковый накопитель| Point(doClear) link(Str1,1249226:Var3,[(1224,282)(1261,282)(1261,341)]) AddHint(-114,-53,133,13,@Hint) } Add(GetDataEx,1249226,1218,336) { link(Data,14672193:Result,[]) } Add(DoData,8505099,1218,364) { @Hint=#22:Перенаправление данных| link(onEventData,9218302:onOutput,[]) link(Data,1249226:Var2,[]) AddHint(-102,69,147,13,@Hint) } Add(GetDataEx,16364596,973,266) { Angle=3 link(Data,13652235:Value,[(922,271)(922,331)(867,331)]) } Add(BlockFind,13542008,315,140) { @Hint=#36:Поиск режима Chunked передачи данных| @Color=9360639 Delete=0 StartBlock="Transfer-Encoding:" EndBlock="chunked" Point(onNotFind) link(onSearch,15047654:doEvent1,[]) link(onNotFind,9218302:onNotChunk,[(361,160)(361,454)(1289,454)(1289,377)]) AddHint(-62,-71,189,26,@Hint) } Add(Convertor,7706637,504,280) { @Hint=#22:Преобразователь данных| Mode=12 link(onResult,2003248:doCopy,[]) AddHint(-26,58,146,13,@Hint) } Add(Convertor,11205451,1162,294) { @Hint=#22:Преобразователь данных| Mode=11 link(onResult,14672193:doStrCat,[]) link(Data,13521530:Var3,[(1168,187)]) AddHint(-122,-34,146,13,@Hint) } Add(StrList,1716261,112,259) { Point(doGetString) Point(onGetString) link(Str,9218302:Data,[]) link(onGetString,1039286:doCase,[]) } Add(DoData,12591004,63,273) { Data=Integer(0) link(onEventData,1716261:doDelete,[]) } Add(DoData,3547378,63,371) { Data=Integer(0) link(onEventData,1716261:doGetString,[(103,377)(103,307)]) } Add(Case,1039286,154,266) { Value=String() link(onNextCase,8738286:doEvent1,[]) } Add(Hub,8738286,196,266) { link(onEvent1,13296706:doSearch,[]) link(onEvent2,12591004:doData,[(221,279)(221,230)(52,230)(52,279)]) } Add(InfoTip,8154874,28,56) { Info=#14:Очередь данных| Font=[MS Sans Serif,8,1,0,1] Frame=3 Width=211 Height=424 Margin=10 } END_SDK Add(Memory,1853942,994,182) { link(onData,11695545:doSafeMode,[]) } Add(SafeMode,11695545,1050,182) { link(onSafeMode,11156933:Input,[]) } Add(Hub,9509036,1190,182) { link(onEvent1,6106760:doEvent1,[]) link(onEvent2,15412616:doWork1,[(1222,195)]) } Add(Thread,15450140,1001,364) { Delay=25 link(onExec,9777364:doSafeMode,[]) link(onSyncExec,11976633:doEvent,[]) } Add(SafeMode,9777364,1057,364) { link(onSafeMode,11156933:PopData,[(1098,370)(1098,195)]) } Add(Hub,15289855,959,322) { link(onEvent1,1566672:doReset,[]) link(onEvent2,15450140:doStart,[(987,335)(987,370)]) } Add(IndexToChanel,11976633,1246,371) { @Hint=#25:Коммутатор синхроимпульса| Point(Index) link(onEvent2,15450140:doStop,[(1290,384)(1290,416)(987,416)(987,377)]) link(Index,1566672:State,[]) AddHint(-187,51,164,13,@Hint) } Add(Switch,1566672,1246,315) { @Hint=#28:Переключатель синхроимпульса| DataOn=Integer(1) DataOff=Integer(0) Point(State) Point(doOn) AddHint(-229,-22,182,13,@Hint) } Add(HubEx,15412616,1218,329) { link(onEvent,1566672:doOn,[]) } Add(BlockFind,6687860,896,322) { @Hint=#15:Поиск заголовка| @Color=9360639 Delete=0 StartBlock="HTTP" EndBlock="13101310" link(onSearch,6570675:doWork2,[]) AddHint(-8,-52,103,13,@Hint) } Add(HubEx,6570675,943,322) { link(onEvent,15289855:doEvent1,[]) } Add(Hub,11742242,840,182) { link(onEvent1,1853942:doValue,[]) link(onEvent2,6687860:doSearch,[(878,195)(878,328)]) } Add(BlockFind,1560143,700,217) { IncludeBlock=1 StartBlock="</entry>" EndBlock="</feed>" Point(doStop) link(onSearch,4049894:doStrCat,[(741,223)(741,188)]) } END_SDK
Но не понимаю зачем ему это надо.
------------
чуть исправил схему, лучше цеплаться за конец XML-ля, тогда, вообще, верняк. Спасибо nesco, не знаю, шо б я без Вас делал!!!
|