Subscribe

Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 26Mar

    table-versus-divУ JQuery есть возможность парсить ХМЛ как текст, если передавать его как аргумент «волшебной функции»

    Я это использовал для парсинга XML респонса аякса. Происходило это вот так:

    $.ajax({
    1.  'url':url,
    2.  'dataType':'text',
    3.  'type':"POST",
    4.  'data':data,
    5.  'contentType':'text/xml',
    6.  'success':function(data){
    7.   parser.parse($(data))
    8.  }
    9. })

    Т.к. если аргументом функции JQ передать текст, то она его переводит объект, для которого доступны все функции JQ. По крайней мере я так думал до недавнего времени.

    Как в последствии оказалось:

    Следующий код в mozilla и IE6 будет давать разные результаты.

    1. $('<nn><c1 /><c1/></nn>').children().length

    mozilla – 2
    IE6 – 0

    А все почему, я по детской наивности откладываю тестирование проекта в IE на последний момент. Наверно потому, что во мне сидит маленький человечек и говорит, что типа «забей, все равно в ИЕ6 никогда все нормально не работает, поэтому тр…ся будеш потом, а пока получай удовольствие и думай, что у тебя все работает отлично»

    Так что пришлось экстренно переделывать, Мы поменяли dateType + в функцию теперь заходит объект DOM, а не текст. И с ним уже надо работать по другим правилам.

    1. $.ajax({
    2.   'url':url,
    3.   'dataType':'xml',
    4.   'type':"POST",
    5.   'data':data,
    6.   'contentType':'text/xml',
    7.   'success':function(data){
    8.      parser.parse(data.documentElement)
    9.   }
    10. })

    В mozilla такое работает, но в ИЕ даже в эту функцию не заходит. Проблема оказалась в хеадере, необходимо передавать Content-Type: text/xml . Сразу решил у XML составить правильную шапочку.

    1. <?xml version="1.0" encoding="utf-8" ?>

    Если серверную часть вы пишите на Django, то вам просто придётся респонсы переделать.

    1. return HttpResponse(''+response,'text/xml; charset=utf-8')

    В процессе парсинга я обрабатываю чаилд ноды. Поэтому ниже я приведу некоторый функционал, который я использую для прохода и получения данных со всей структуры данных.

    Проходимся по всем childNodes:

    1. var childs = el.childNodes
    2. for(var i=0;i<childs.length;i++){
    3.   if(childs[i].nodeName!='#text'){
    4.    parseXml(childs[i])
    5.   }
    6.  }

    Получение аттрибута:

    1. el.getAttribute('id')

    Получения текста:

    1. el.childNodes[0].nodeValue

    Но если вам необходимо парсить текст, который к вам зашёл не через ajax. У меня, к примеру, флешка через External Interface передает аргументы ХМЛ, который необходимо уже парсить внутри JS. Для этих целей я написал отдельную функцию:

    1. function textToXmlEl(text){
    2.    return (new DOMParser()).parseFromString(text,'text/xml').documentElement
    3. }
    4.   if($.browser.msie){
    5.      textToXmlEl = function(text){
    6.       var xml = new ActiveXObject("Microsoft.XMLDOM");
    7.       xml.async = false;
    8.       xml.loadXML(text);
    9.       return xml.documentElement
    10.      }
    11.  }

    первая функция работает для mozilla, но если вы являетесь счастливым обладателем IE, то функция будет переопределена.

    Функционал ещё тестируется и дорабатывается, поэтому я, возможно, буду ещё дописывать и изменять эту статью, так что, жду вашу конструктивную критику.

    И хотя с одной стороны — это бросок камня в огород JQuery, с другой — функционал, которым я хотел воспользоваться — не документирован, а значит за правильную кросбраузерную поддержку разработчики не отвечают. Да и из всего написанного мною кода — это единственная недоработка.

    PS: В Джанго есть еще конфиги DEFAULT_CONTENT_TYPE, это на случай, если вы не хотите переписывать строчку с HttpResponse и вы всегда возвращаете только ХМЛ

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , , , ,

  • 01Dec

    Сегодня из интереса написал небольшой модуль сериализации в ХМЛ. На скорую руку. Как по мне – довольно элегантное решение. Как думаете?

    1. def xml_escape(text):
    2.     return str(text).replace('&','&amp;').replace('<','&lt;').replace('>','&gt;').replace('"','&quot;').replace("'",'&apos;')
    3.  
    4. def xmlSerial(name,attr=None,inner=None):
    5.     if attr:
    6.         name_attr = name+' '+' '.join(map(lambda (a,b):a+'="'+xml_escape(b)+'"',attr.items()))+' '
    7.     else:
    8.         name_attr = name
    9.    
    10.     if inner:
    11.         if type(inner) == list:
    12.             inner_str = ''.join(map(lambda a: xmlSerial(*a),inner))
    13.         else:
    14.             inner_str = inner
    15.         return '<'+name_attr+'>'+inner_str+'</'+name+'>'
    16.     else:
    17.         return '<'+name_attr+'/>'

    Вот, как его мона юзать:

    1. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}],['WIN',{'a':1},'HI IT IS INNER']])
    2. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW',{'and_attr':'45t'}]])
    3. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},[['RR'],['WOW']])
    4. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'},'AND INNER')
    5. print xmlSerial('HI',{'a':'1','c':3,'d':'WOW'})
    6. print xmlSerial('HI',{'a':'1'})
    7. print xmlSerial('HI')
    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

   

Recent Posts

Recent Comments

  • похоже, опчатка...
  • JSONotEncode - Это JSON Not Encode? Не сразу это понял )...
  • В чем фишка этого маневра-дублирования?loads = json.l...
  • Очень понравилось!...
  • Если данные простые, я чаще всего пихаю их в ту же таблиц...