nataraj: (Default)
[personal profile] nataraj
И в Симе и в Пси, запросы, посылаемые серверу, конструируются спецуевым XML-конструктором (типа XML-парсер, только наоборот, не знаю какое правильное слово для него есть). Последовательно вызываются функции, вида "начался элемент", "в начавшийся элемент добавили атрибут", "внутрь элемента добавить текст или другой элемент", закрыть открытый элемент...

При этом не знаю как в Пси, я глубоко не смотрел, но в Симе эти функции в процессе конструирования запихивают полученную конструкцию в сокет.

В результате сам метод send() фактически ничего не посылает, а просто дозакрывает незакрытые теги...

Внимание вопрос: А зачем городить такой огород? Что мешает при отправке запроса руками вставить нужные заискейпленные и заамперсаженные значения в собранную руками XML'ку?
s="<iq"+
    "type='result'"+
    "to='"+to_address+"''+
    "from='"+from_address+"'"+
    "id='"+id+"'>"+
  "<query xmlns='jabber:iq:version'>"+
   " <name>"+client_name+"</name>"+
   " <version>"+client_version+"</version>"+
   " <os>"+os+"</os>"+
  "</query>"
"</iq>"

И потом просто запихнуть ее в сокет...

Оно возможно не столь эстетично... Но во-первых мозг съедает меньше... А во-вторых позволяет отделить код конструирования запроса от кода посылки, чего тоже очень хочется...
И в каком-то смысле более удовлетворяет принципу KISS(Keep It Simple Stupid)

Очень хочется понять какие бонусы дает тот вариант, который применен сейчас в симе и пси... Ведь зачем-то это делалось!

ЗЫ. Я просто сейчас подошел к переписыванию этого куска, и хочу понять, следовать ли традиции, или же выпендрится...

Date: 2007-11-05 09:22 pm (UTC)
From: [identity profile] slobin.livejournal.com

"Потому что оно на С++ написано." Всё языки делятся на две большие группы -- лисп и все остальные. Вряд ли моя реплика поможет хозяину журнала, но удержаться не смог -- the LISP way:

(load "sxml2xml.lsp")

(setq to_address "a&b" from_address {"cd"} id 456
      client_name "<clmn>" client_version "per'ver" os "os/2")

(setq pattern '(iq (@ (type "result")
                      (to to_address) 
                      (from from_address)
                      (id id))
                   (query (@ (xmlns "jabber:iq:version"))
                          (name client_name)
                          (version client_version)
                          (os os))))

(sxml2xml print pattern 2)

Результат:

<iq type="result" to="a&amp;b" from="&quot;cd&quot;" id="456">
  <query xmlns="jabber:iq:version">
    <name>
      &lt;clmn&gt;
    </name>
    <version>
      per&apos;ver
    </version>
    <os>
      os/2
    </os>
  </query>
</iq>

Правда, в этой реализации лиспа есть из коробки XML-парсер, но почему-то нет XML-эмиттера. Ну то есть я знаю, почему: потому что при его написании я уложился в 999 символов. ;-) Спасибо хозяину журнала и автору предыдущей реплики за задачку на потренироваться. (Примечание: предыдущую версию этого комментария я удалил -- там была небольшая ошибка (я невнимательно прочитал исходный сишный текст и запутался в кавычках и апострофах)).

... Удивительное - рядом, но оно запрещено ...

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 20th, 2026 07:04 pm
Powered by Dreamwidth Studios