>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >XMLHTTPRequest в IE и Mozilla http://forum.mozilla-russia.org/viewtopic.php?id=6198 |
Corvus > 15-11-2005 18:04:06 |
Граждане! Может кто сталкивался с такой лажей. В IE следующий XML: Выделить код Код:<xml version="1.0" encoding="UTF-8" standalone="yes"> <events> <event> <descr>Test event 1</descr> <author>corvus</author> </event> <event> <descr>Test event 2</descr> <author>corvus</author> </event> </events> </xml> при помощи XMLHttpRequest грузится нормально (т.е. Выделить код Код:request.responseXML.documentElement.getElementsByTagName("events")[0].childNodes.length дает значение 2, и в дальнейшем в цикле все нормально парсится). В FF же childNodes.length = 3 (!!!) и есессно парсинг обламывается. Вот кусок кода, который я использую: Выделить код Код:xmlDocDay = req_day.responseXML.documentElement; alert(req_day.responseText); // чисто для отладки d_rootobj=xmlDocDay.getElementsByTagName("events")[0]; s = "<table width='100%' border=0>"; alert(d_rootobj.childNodes.length); // вот тут в IE - 2, а в FF - 3 for (i=0;i<d_rootobj.childNodes.length;i++) { c_event = d_rootobj.getElementsByTagName("event")[i]; s += "<tr><td>"; s += c_event.getElementsByTagName("descr")[0].firstChild.nodeValue; s += "</td><td>"; s += c_event.getElementsByTagName("author")[0].firstChild.nodeValue; s += "</td></tr>"; } |
Anton > 16-11-2005 06:14:03 |
Corvus пишет
У меня childNodes.length для указанного xml дает значение 5 Только это не баг. Выделить код Код:var ch = request.responseXML.documentElement.getElementsByTagName("events")[0].childNodes; for (i in ch) alert (ch [i]. nodeName); показывает наличие текстовых узлов. У меня:
Мда... Парсер, конечно, маленько кривоват. Если ему мешают текстовые узлы в документе, их можно удалить из xml - вот так: Выделить код Код:<xml version="1.0" encoding="UTF-8" standalone="yes"> <events> <event> <descr>Test event 1</descr> <author>corvus</author> </event><event> <descr>Test event 2</descr> <author>corvus</author> </event></events> </xml> Или исправить парсер, чтобы текстовые узлы ему не мешали. Вот так: Выделить код Код:... var events = d_rootobj. getElementsByTagName ("event"); for (i=0;i<events.length;i++) { c_event = events[i]; ... |
Corvus > 16-11-2005 11:34:38 |
А я и не говорил, что это баг Я назвал это лажей, причем не уточнил, чей именно
Угу. Кто ж спорит Я ж так, в порядке эксперимента его набросал.
Проблема в том, что этот XML генерируется PHP-скриптом. Видать где-то я там вставил лишние символы.
Cool! Помогло! Спасибо! |
SOb > 18-11-2005 00:11:53 |
Как вариант - использовать XPath для выбора значений (google->XPath и) |
Anton > 18-11-2005 05:25:32 |
SOb пишет
А в IE/Opera XPath работает ? Я пробовал "скормить" им пример, работающий в FF - ноль эмоций. |
Al_H > 18-11-2005 11:25:52 |
В IE не работает |
Anton > 18-11-2005 16:00:26 |
Как вариант, можно xslt использовать. Я, правда, не силен... Что-то вроде этого: Выделить код Код:<?xml-stylesheet type="text/xsl" href="xml_style_file.xsl"?> <xml version="1.0" encoding="UTF-8" standalone="yes"> <events> <event> <descr>Test event 1</descr> <author>corvus</author> </event> <event> <descr>Test event 2</descr> <author>corvus</author> </event> </events> </xml> + xml_style_file.xsl: Выделить код Код:<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml"> <xsl:template match="/"> <xhtml:html> <xhtml:head> </xhtml:head> <xhtml:body> <xhtml:table width="100%" border="0"> <xsl:apply-templates/> </xhtml:table> </xhtml:body> </xhtml:html> </xsl:template> <xsl:template match="//event"> <xhtml:tr> <xsl:apply-templates/> </xhtml:tr> </xsl:template> <xsl:template match="//descr | //author"> <xhtml:td> <xsl:value-of select="."/> </xhtml:td> </xsl:template> </xsl:stylesheet> Будет работать в FF и в IE. Правда, для IE надо убрать префиксы xhtml: P.S.: Сейчас только заметил, и для FF можно обойтись без xhtml: префиксов. Странно... Раньше не работал без них... %-/ |