Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
892
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2598
0
Рекомендации по синтаксическому анализу AS3 XML
У меня были некоторые проблемы с разбором различных типов XML внутри flash (в частности, FeedBurner RSS файлов и YouTube Data API ответов). Я использую URLLoader для загрузки файла XML, а после Event.COMPLETE создаю новый объект XML. 75% время от времени это работает нормально, и время от времени я получаю этот тип исключения:
TypeError: Error #1085: The element type "link" must be terminated by the matching end-tag "</link>".
Мы думаем, что проблема заключается в том, что XML является большим, и, возможно, событие Event.COMPLETE запускается до того, как XML фактически загружается с URLLoader . Единственное решение, которое мы придумали, - это установить таймер на событие, и по существу "wait a few seconds", прежде чем начать анализировать данные. Конечно, это не может быть лучшим способом сделать это.
Есть ли какой-нибудь верный способ разобрать XML внутри Flash?
Update Sept 2 2008 мы пришли к следующему выводу, что в этот момент в коде срабатывает исключение:
data = new XML(mainXMLLoader.data);
// calculate the total number of entries.
for each (var i in data.channel.item){
_totalEntries++;
}
Я разместил оператор try/catch вокруг этой части и в настоящее время отображаю сообщение об ошибке на экране, когда это происходит. Мой вопрос заключается в том, как неполный файл дойдет до этой точки, если bytesLoaded == bytesTotal ?
Я обновил исходный вопрос с отчетом о состоянии; я предполагаю, что другой вопрос может быть в том, есть ли способ определить, правильно ли проанализирован объект XML перед обращением к данным (в случае ошибки, если мой цикл подсчета количества объектов начинается до того, как XML фактически анализируется в объект)?
@Theo: Спасибо за подсказку ignoreWhitespace. Кроме того, мы определили, что событие вызывается до его готовности (мы провели несколько тестов трассировки mainXMLLoader.bytesLoaded + "/" + mainXMLLoader.bytesLoaded
Вы пробовали проверить, что загруженные байты совпадают с общим количеством байт?
URLLoader.bytesLoaded == URLLoader.bytesTotal
Это должно сказать вам, если файл закончил загрузку, это не поможет с запуском события compleate раньше, но он должен сказать вам, если его проблема с xml была прочитана.
Я не уверен, что он будет работать над доменами, так как мой xml всегда находится на одном и том же сайте.
Меня беспокоит то, что он может выстрелить Event.COMPLETE до того, как он закончит заряжаться, и это заставляет меня задуматься, не истекает ли время ожидания загрузки.
Как часто возникает эта проблема? Можете ли вы добиться успеха в один момент,а затем потерпеть неудачу в следующий же день с той же самой подачей?
В целях тестирования попробуйте проследить URLLoader.bytesLoaded и URLLoader.bytesTotal в верхней части метода обработчика Event.COMPLETE . Если они не совпадают, вы знаете, что событие происходит преждевременно. Если это так, вы можете прослушать событие URLLoader's progress. Проверьте bytesLoaded против bytesTotal в вашем обработчике и проанализируйте XML только после того, как загрузка действительно завершена. Конечно, это очень похоже на то , что делает URLLoader, прежде чем он выстрелит Event.COMPLETE, но если это сломано, вы можете попробовать свернуть свой собственный.
Пожалуйста, дайте нам знать, что вы узнаете. И если вы можете, пожалуйста, вставьте в него какой-нибудь исходный код. Возможно, нам удастся обнаружить что-нибудь примечательное.
иногда страница сервера RSS может не выдавать правильные и действительные данные XML, особенно если вы постоянно нажимаете на нее, поэтому это может быть не ваша вина. Вы пробовали зайти на страницу в веб-браузере (желательно с плагином xml validator), чтобы проверить, что ответ сервера всегда действителен?
Единственное, что я еще могу здесь увидеть-это линия:
xml = new XML(event.target.data);
//the data should already be XML, so only casting is necessary
xml = XML(event.target.data);
Вы также пробовали установить urlloader dataFormat в URLLoaderDataFormat.TEXT, а также добавить заголовки url из prama-no-cache и / или добавить кэш-Бастер tot he url?
Просто несколько предложений...
Я предлагаю вам отправить отчет об ошибке в https://bugs.adobe.com/flashplayer/, потому что событие действительно не должно срабатывать до того, как все байты будут загружены. А пока, я думаю, тебе придется жить с таймером. Вы можете сделать то же самое, прослушав вместо этого событие progress, что, возможно, избавит вас от необходимости самостоятельно обрабатывать таймер.
Обработчик Event.COMPLETE действительно не должен вызываться, если загрузчик не был полностью загружен, это не имеет смысла. Вы подтвердили, что он на самом деле не полностью загружен (посмотрев на значения bytesLoaded против bytesTotal , которые вы trace)? Если событие Event.COMPLETE отправляется до bytesLoaded == bytesTotal , то это ошибка.
Хорошо, что он работает с таймером, но очень странно, что он вам нужен.
Как вы уже упоминали в своем вопросе, проблема, скорее всего, заключается в том, что ваша программа смотрит на XML до того, как она фактически была полностью загружена, я не знаю, есть ли верный способ "parse" XML, потому что разбор части вашего кода более чем вероятно хорош, это просто вопрос того, действительно ли он был загружен.
Вы можете попробовать использовать событие ProgressEvent.PROGRESS, чтобы постоянно отслеживать XML по мере его загрузки, а затем, как предложил Re0sless, проверить bytesLoaded против bytesTotal и начать разбор XML, когда два числа равны, вместо того чтобы использовать событие Event.COMPLETE.
Вы должны быть в состоянии получить номера bytesLoaded и bytesTotal просто отлично, независимо от доменов, если вы можете получить доступ к файлу, вы можете получить доступ к его байтовой информации.
Если бы вы могли опубликовать еще немного кода, мы могли бы найти эту проблему.
Еще одна вещь, которую нужно проверить (помимо трассировки bytesTotal) - это trace свойство data загрузчика в обработчике Event.COMPLETE , просто чтобы увидеть, действительно ли данные XML были загружены правильно, например, проверить, что там есть </link> .
@Brian Warshaw: эта проблема возникает только около 10-20% раз. Иногда это икота и просто перезагрузка приложения будет работать нормально, в других случаях я буду тратить полчаса на перезагрузку приложения снова и снова безрезультатно.
Это исходный код (когда я задал вопрос):
public class BlogReader extends MovieClip {
public static const DOWNLOAD_ERROR:String = "Download_Error";
public static const FEED_PARSED:String = "Feed_Parsed";
private var mainXMLLoader:URLLoader = new URLLoader();
public var data:XML;
private var _totalEntries:Number = 0;
public function BlogReader(url:String){
mainXMLLoader.addEventListener(Event.COMPLETE, LoadList);
mainXMLLoader.addEventListener(IOErrorEvent.IO_ERROR, errorCatch);
mainXMLLoader.load(new URLRequest(url));
XML.ignoreWhitespace;
}
private function errorCatch(e:IOErrorEvent){
trace("Oh noes! Yous gots no internets!");
dispatchEvent(new Event(DOWNLOAD_ERROR));
}
private function LoadList(e:Event):void {
data = new XML(e.target.data);
// calculate the total number of entries.
for each (var i in data.channel.item){
_totalEntries++;
}
dispatchEvent(new Event(FEED_PARSED));
}
}
И это код, который я написал на основе оригинального ответа Re0sless (аналогично некоторым упомянутым предложениям):
public class BlogReader extends MovieClip {
public static const DOWNLOAD_ERROR:String = "Download_Error";
public static const FEED_PARSED:String = "Feed_Parsed";
private var mainXMLLoader:URLLoader = new URLLoader();
public var data:XML;
protected var _totalEntries:Number = 0;
public function BlogReader(url:String){
mainXMLLoader.addEventListener(Event.COMPLETE, LoadList);
mainXMLLoader.addEventListener(IOErrorEvent.IO_ERROR, errorCatch);
mainXMLLoader.load(new URLRequest(url));
XML.ignoreWhitespace;
}
private function errorCatch(e:IOErrorEvent){
trace("Oh noes! Yous gots no internets!");
dispatchEvent(e);
}
private function LoadList(e:Event):void {
isDownloadComplete();
}
private function isDownloadComplete() {
trace (mainXMLLoader.bytesLoaded + "/" + mainXMLLoader.bytesLoaded);
if (mainXMLLoader.bytesLoaded == mainXMLLoader.bytesLoaded){
trace ("xml fully loaded");
data = new XML(mainXMLLoader.data);
// calculate the total number of entries.
for each (var i in data.channel.item){
_totalEntries++;
}
dispatchEvent(new Event(FEED_PARSED));
} else {
trace ("xml not fully loaded, starting timer");
var t:Timer = new Timer(300, 1);
t.addEventListener(TimerEvent.TIMER_COMPLETE, loaded);
t.start();
}
}
private function loaded(e:TimerEvent){
trace ("timer finished, trying again");
e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, loaded);
e.target.stop();
isDownloadComplete();
}
}
Я отмечу, что с момента добавления кода определения mainXMLLoader.bytesLoaded == mainXMLLoader.bytesLoaded у меня не было проблемы - тем не менее, эту ошибку трудно воспроизвести, поэтому, насколько я знаю, я ничего не исправил, а вместо этого просто добавил бесполезный код.
Вы можете установить уникальное пространство имен элементов в самом конце вашего документа XML, который имеет один атрибут "value", равный "true";
//The XML
//Flash ignores the line that specifies the XML version and encoding so I have here as well.
<parent>
<child name="child1" />
<child name="child2" />
<child name="child3" />
<child name="child4" />
<documentEnd value="true" />
</parent>
//Sorry about the spacing, but it is difficult to get XML to show.
//Flash
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest('pathToXML/xmlFileName.xml');
var xml:XML;
//Event Listener with weak reference set to true (5th parameter);
//The above comment does not define a required practice, this is to aid with garbage collection.
loader.addEventListener(Event.COMPLETE, onXMLLoadComplete, false, 0, true);
loader.load(request);
function onXMLLoadComplete(e:Event):void
{
xml = new XML(e.target.data);
//Now we check the last element (child) to see if it is documentEnd.
if(xml[xml.length()-1].documentEnd.@value == "true")
{
trace("Woot, it seems your xml made it!");
}
else
{
//Attempt the load again because it seems it failed when it was unable to find documentEnd in the XML Object.
loader.load(request);
}
}
Я надеюсь, что это поможет вам сейчас, но реальная надежда заключается в том, что достаточное количество людей сообщит adobe об этом вопросе. Печально, что мы не можем полагаться на события. Однако я должен сказать, что из того, что я слышал о XML, он не очень оптимален в больших масштабах, и полагаю, что это происходит, когда вам требуется что-то вроде AMFPHP для сериализации данных.
Надеюсь, это поможет! Помните, что идея здесь заключается в том, что мы знаем, какой самый последний дочерний элемент/элемент в XML, потому что мы его устанавливаем! Нет никаких причин, по которым мы не могли бы получить доступ к последнему child/element,, но если мы не можем, мы должны предположить, что XML действительно не был завершен, и мы заставляем его загружаться снова.