При выводе данных из *sql таблицы или cgi запроса, да хоть при обработке xml файла, можно включить систему событий для обработки отдельных полей, возможно это велосипед, но я не нашёл способа лучше.
Короче делаю так:
# добавляет XML тег защиты от XSLT процессора
def make_cdata(str):
return "защита от"+str+"xslt процессора"
# создаю кортеж со значениями имя поля - имя функции обработчика
# для поля MESSAGE применится функция make_cdata, защищающая её от XSLT процессора
# для поля ID будет проведенно преобразование к типу int
event = {"MESSAGE":make_cdata,"ID":int}
# затем, передаю этот вектор в обработчик cgi,sql,xml, да куда угодна
if bd_sql.execute(sql)> 0 :
xml = bd_sql.get_xml(root="post",event)
# а в этом обработчике пишу код:
# тут, например, присутвует код перебора выбранных строк, скорее всего
# велосипед, и вставку в xml шаблон, но
xml_str="<%s>"%root
for i in range(0,self.__res__):
row = self.__curs__.fetchone()
rt={}
# генерация XML документа
for i in range(len(fields)):
try:
# от тут магия, если имеется поле с именем как в векторе собитий
# то к значению поля применяется заданная нами функция
rt[fields[i]]=event[fields[i]](row[i])
except:
rt[fields[i]]=row[i]
xml_str+=xml_str_tmpl%rt
return xml_str+""%root
мне понравилось такое компактное решение, особенно если представить сколько надо навелосипедить на С++
Я собираюсь такой приём можно применить для обработки входящих сообщения на наличие ключевых слов, ссылок, да мало ли чего, это просто удобно.
Подписаться на:
Комментарии к сообщению (Atom)
1 комментарий:
s/кортеж/словарь/g ;)
Отправить комментарий