Форум сайта python.su
Опишу ещё раз для чего всё это надо!
Есть система транспортировки между подсистемами, в которой настраиваются транспортные линии для приёма и отправки сообщений. К каждой транспортной линии можно прикрутить питон-сценарий для обработки как самого тела сообщения так и атрибутов транспортировки(получателя, отправителя и т.д).
…о том что мне нужно сделать с телом сообщения я уже говорил.
Вот пример кода который работает.. и меняет получателя сообщения:
# разбиение пакетов на отдельные сообщения и выделение основных реквизитов:
# Эти реквизиты являются !ОБЯЗАТЕЛЬНЫМИ!
# ‘BODY’ - тело сообщения
# ‘TRATTR’ - DataSet, содержащий следующие атрибуты для маршрутизации
# ‘RECIPIENT’ - получатель
# ‘SENDER’ - отправитель
# Во входном DataSet-t есть поле PKGATTR, содержащее атрибуты пакета, возвращённые
# транспортной линией при приёме пакета.
#
import re
import string
from Colvir import *
pkgbody = inDs
outDs.clear()
outDs.addField('TRATTR', ftDataSet)
outDs.addField('BODY', ftString)
outDs.append()
AttrSet = outDs
AttrSet.append()
AttrSet = ‘ПОЛУЧАТЕЛЬ’
outDs = pkgbody
Офлайн
а что за модуль Colvir? Если нет xml.sax.saxutils то необходимо поставить питон поновее.
Что то у вас запутано очень все… я раз 5 прочитал последний пост, так и не смог все связать воедино :)
Отредактировано (Ноя. 12, 2008 14:28:31)
Офлайн
igor.kaistСкрипт вызывается из внешней системы. Это явно модуль связи с ней
а что за модуль Colvir?
Офлайн
Поймите, полностью задачу за вас никто не решит. И тем более не отладит в вашем окружении. Еще и не зная версию python и установленные модули. Мы можем только написать варианты решения
Собственно у вас две подзадачи: разобрать входные данные и сформировать выходной ХМЛ.
По поводу первой: если текстовые данные содержатся в inDs и имеют тот формат что вы указали, то разобрать их можно так:
#идем по строкам в тексте
for s in inDs['BODY']:
#разбиваем строку на отдельные элементы
ls = s.split('|')
#это модуль для доступа к строке в памяти как к файлу
from cStringIO import StringIO
#в doc мы будем формировать XML
doc = StringIO()
#пишем корневой элемент
doc.write('<DATA>')
#для каждой строки формируем запись в xml
for s in inDs['BODY']:
ls = []
for x in s.split('|'):
ls.append(clear(x))
doc.write('<RECORD DATE="%s" FIO="%s"/>' % tuple(ls))
#закрываем корневой элемент
doc.write('</DATA>')
#записываем сформированный xml в поле и закрываем файл в памяти
outDs['BODY'] = doc.getvalue()
doc.close()
def clear(s):
s = s.strip()
s = s.replace("&", "&")
s = s.replace(">", ">")
s = s.replace("<", "<")
return s.replace('"', '"')
Отредактировано (Ноя. 13, 2008 06:42:41)
Офлайн
Сейчас обязательно попробую сделать как Вы посоветовали. У меня получилось формировать XML, но построчно - то есть на выходе я получаю несколько сообщения - на каждую строку входного файла своё, а так всё правильно работает. Вот код формирование для каждой строки своего XML - только как теперь всё это бы объединить в один XML?
from Colvir import *
import re
import cssutil
from string import split
fld = {}
fld = ‘FRMT’ # РНН
fld = ‘FIO’ # ФИО
packDS = inDs
#frmt = packDS
msg = inDs
str_lst = re.findall('(?im)^.+$', msg)
outDs.clear()
outDs.addField('TRATTR', ftDataSet)
outDs.addField('BODY', ftString)
# формирование выходного XML-я.
import msxml2
import time
for ss in str_lst:
outDs.append()
sl = split(ss, ‘|’)
sl = map(cssutil.ansistr, sl)
Doc = msxml2.DOMDocument()
root_node = Doc.createElement('MSG')
root_node.setAttribute('FORMAT', ‘MAIL’)
root_node.setAttribute('SENDER', ‘UPBDRNN’)
root_node.setAttribute('RECIPIENT', ‘POLUCHALKIN’)
# Doc.appendChild(root_node)
node = Doc.createElement('DATA')
root_node.appendChild(node)
for i in range(0, len(sl)-1):
if fld.has_key(i):
node.setAttribute(fld, sl)
for i in range(1, len(sl)):
if fld.has_key(i):
node.setAttribute(fld, sl)
Doc.appendChild(root_node)
# добавляем необходимое для LoadFromXML c_bsord-a
attrDS = outDs
attrDS.append()
attrDS = ‘tst’
attrDS = ‘L00’
attrDS = ‘RTL00’
outDs = Doc.xml
del root_node
del Doc
Офлайн
Doc = msxml2.DOMDocument()
root_node = Doc.createElement('MSG')
root_node.setAttribute('FORMAT', 'MAIL')
root_node.setAttribute('SENDER', 'UPBDRNN')
root_node.setAttribute('RECIPIENT', 'POLUCHALKIN')
Doc.appendChild(root_node)
for ss in str_lst:
sl = split(ss, '|')
sl = map(cssutil.ansistr, sl)
node = Doc.createElement('DATA')
root_node.appendChild(node)
for i in range(0, len(sl)-1):
if fld.has_key(i):
node.setAttribute(fld[i], sl[i])
for i in range(1, len(sl)):
if fld.has_key(i):
node.setAttribute(fld[i], sl[i])
# добавляем необходимое для LoadFromXML c_bsord-a
attrDS = outDs['TRATTR']
attrDS.append()
attrDS['FORMNAME'] = 'tst'
attrDS['SENDER'] = 'L00'
attrDS['RECIPIENT'] = 'RTL00'
outDs['BODY'] = Doc.xml
del root_node
del Doc
Отредактировано (Ноя. 13, 2008 07:08:57)
Офлайн
Ругается на
Doc = msxml2.DOMDocument()
Офлайн
Vjnвсе же какая версия питона?
from string import split
Офлайн
Версия Питона 1.5
Офлайн
VjnКак именно ругается? Я надеюсь вы import msxml2 поместили до Doc = msxml2.DOMDocument()?
Ругается на
Doc = msxml2.DOMDocument()
Офлайн