У JQuery есть возможность парсить ХМЛ как текст, если передавать его как аргумент «волшебной функции»
Я это использовал для парсинга XML респонса аякса. Происходило это вот так:
-
'url':url,
-
'dataType':'text',
-
'type':"POST",
-
'data':data,
-
'contentType':'text/xml',
-
'success':function(data){
-
parser.parse($(data))
-
}
-
})
Т.к. если аргументом функции JQ передать текст, то она его переводит объект, для которого доступны все функции JQ. По крайней мере я так думал до недавнего времени.
Как в последствии оказалось:
Следующий код в mozilla и IE6 будет давать разные результаты.
-
$('<nn><c1 /><c1/></nn>').children().length
mozilla – 2
IE6 – 0
А все почему, я по детской наивности откладываю тестирование проекта в IE на последний момент. Наверно потому, что во мне сидит маленький человечек и говорит, что типа «забей, все равно в ИЕ6 никогда все нормально не работает, поэтому тр…ся будеш потом, а пока получай удовольствие и думай, что у тебя все работает отлично»
Так что пришлось экстренно переделывать, Мы поменяли dateType + в функцию теперь заходит объект DOM, а не текст. И с ним уже надо работать по другим правилам.
-
$.ajax({
-
'url':url,
-
'dataType':'xml',
-
'type':"POST",
-
'data':data,
-
'contentType':'text/xml',
-
'success':function(data){
-
parser.parse(data.documentElement)
-
}
-
})
В mozilla такое работает, но в ИЕ даже в эту функцию не заходит. Проблема оказалась в хеадере, необходимо передавать Content-Type: text/xml . Сразу решил у XML составить правильную шапочку.
-
<?xml version="1.0" encoding="utf-8" ?>
Если серверную часть вы пишите на Django, то вам просто придётся респонсы переделать.
-
return HttpResponse(''+response,'text/xml; charset=utf-8')
В процессе парсинга я обрабатываю чаилд ноды. Поэтому ниже я приведу некоторый функционал, который я использую для прохода и получения данных со всей структуры данных.
Проходимся по всем childNodes:
-
var childs = el.childNodes
-
for(var i=0;i<childs.length;i++){
-
if(childs[i].nodeName!='#text'){
-
parseXml(childs[i])
-
}
-
}
Получение аттрибута:
-
el.getAttribute('id')
Получения текста:
-
el.childNodes[0].nodeValue
Но если вам необходимо парсить текст, который к вам зашёл не через ajax. У меня, к примеру, флешка через External Interface передает аргументы ХМЛ, который необходимо уже парсить внутри JS. Для этих целей я написал отдельную функцию:
-
function textToXmlEl(text){
-
return (new DOMParser()).parseFromString(text,'text/xml').documentElement
-
}
-
if($.browser.msie){
-
textToXmlEl = function(text){
-
var xml = new ActiveXObject("Microsoft.XMLDOM");
-
xml.async = false;
-
xml.loadXML(text);
-
return xml.documentElement
-
}
-
}
первая функция работает для mozilla, но если вы являетесь счастливым обладателем IE, то функция будет переопределена.
Функционал ещё тестируется и дорабатывается, поэтому я, возможно, буду ещё дописывать и изменять эту статью, так что, жду вашу конструктивную критику.
И хотя с одной стороны — это бросок камня в огород JQuery, с другой — функционал, которым я хотел воспользоваться — не документирован, а значит за правильную кросбраузерную поддержку разработчики не отвечают. Да и из всего написанного мною кода — это единственная недоработка.
PS: В Джанго есть еще конфиги DEFAULT_CONTENT_TYPE, это на случай, если вы не хотите переписывать строчку с HttpResponse и вы всегда возвращаете только ХМЛ



Recent Comments