Xpoint
   [напомнить пароль]

nsIRDFService, отлов ошибки xml при загрузке url

Метки: [без меток]
2007-06-20 22:10:44 [обр] Kirill(0/3)[досье]
RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
var observer = { 
   onBeginLoad:function(sink){},
   onInterrupt:function(sink){},
   onResume:function(sink){},
   onError:function(sink, status, msg){ /* обработка ошибки загрузки */ alert(msg) },
   onEndLoad:function(sink){ /* загрузка датасорса в целевой элемент. */ }
};
var ds = RDFService.GetDataSource(aUrl);
ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
ds.addXMLSinkObserver(observer);
Каким образом отловить ситуацию с невалидным xml в загружаемом RDF (хочется получить аналог xmlhttp.responseText) ?
Метод onError обсервера не работает, при ошибке xml вызываются методы onBeginLoad и onResume, в которых получить информацию о проблеме не видится возможным. При этом в js-консоли как-то же отлавливается такая ошибка (помечается как 'ошибка xml' и выводится текст невалидного xml/rdf). Анализ исходников консоли пока не дал результатов.
спустя 1 день [обр] Владимир Палант(434/4445)[досье]
При невалидном XML вызывается нормально onEndLoad, ошибка при этом есть в responseXML.
спустя 2 часа 10 минут [обр] Kirill(0/3)[досье]
А откуда в onEndLoad можно responseXML получить ? Туда же приходит nsIRDFXMLSink. К чему его надо привести, чтобы докопаться до текста ответа ?
спустя 8 часов [обр] Владимир Палант(434/4445)[досье]
А, ну да, у вас же RDF. nsIRDFXMLSink можно привести к nsIRDFDataSource, по идее он должен содержать текст ошибки. Вопрос лишь — в каком виде.
спустя 7 часов [обр] Kirill(0/3)[досье]
Мда. Действительно, метод onEndLoad работает всегда, и с невалидным xml rdf-a. Консоль ловит ошибку где-то между ds.addXMLSinkObserver(observer) и вызовами методов обсервера, в т.ч. onEndLoad. Приведение nsIRDFXMLSink к nsIRDFDataSource дает пустой датасорс.
Блин, ну как то в консоли-то оно ловится, и текст невалидного xml показывает ... Таки придется рыть в коде консоли :((
спустя 26 минут [обр] Kirill(0/3)[досье]
Тупо в лоб отловить текст ответа сервера получается через nsIConsoleService, регистрируя nsIConsileListener и разбирая в нем сообщение об ошибке. Но уж больно кривое решение. Хотя, похоже, никаких других способов нет. Если кто-нибудь эту проблему решит красиво - сообщите, плиз. Буду весьма признателен.
Powered by POEM™ Engine Copyright © 2002-2005