Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2008 13:56:23

Vjn
От:
Зарегистрирован: 2008-11-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Опишу ещё раз для чего всё это надо!

Есть система транспортировки между подсистемами, в которой настраиваются транспортные линии для приёма и отправки сообщений. К каждой транспортной линии можно прикрутить питон-сценарий для обработки как самого тела сообщения так и атрибутов транспортировки(получателя, отправителя и т.д).

…о том что мне нужно сделать с телом сообщения я уже говорил.
Вот пример кода который работает.. и меняет получателя сообщения:

# разбиение пакетов на отдельные сообщения и выделение основных реквизитов:
# Эти реквизиты являются !ОБЯЗАТЕЛЬНЫМИ!
# ‘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



Офлайн

#2 Ноя. 12, 2008 14:25:29

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

_Люди помогите с XML

а что за модуль Colvir? Если нет xml.sax.saxutils то необходимо поставить питон поновее.
Что то у вас запутано очень все… я раз 5 прочитал последний пост, так и не смог все связать воедино :)



Отредактировано (Ноя. 12, 2008 14:28:31)

Офлайн

#3 Ноя. 13, 2008 06:07:28

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

_Люди помогите с XML

igor.kaist
а что за модуль Colvir?
Скрипт вызывается из внешней системы. Это явно модуль связи с ней



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Ноя. 13, 2008 06:38:50

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Поймите, полностью задачу за вас никто не решит. И тем более не отладит в вашем окружении. Еще и не зная версию python и установленные модули. Мы можем только написать варианты решения
Собственно у вас две подзадачи: разобрать входные данные и сформировать выходной ХМЛ.
По поводу первой: если текстовые данные содержатся в inDs и имеют тот формат что вы указали, то разобрать их можно так:

#идем по строкам в тексте
for s in inDs['BODY']:
#разбиваем строку на отдельные элементы
ls = s.split('|')
По поводу второй, есть три варианта:
1. формировать файл самому
2. использовать питоновскую библиотеку
3. самый медленный, непереносымый и использованный в вашем примере - использовать msxml через COM и формировать xml через интерфейс DOM
опишу первый как самый простой
#это модуль для доступа к строке в памяти как к файлу
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()
Я специально использовал самые простые конструкции, чтобы все было понятно и работало на всех версиях
Теперь по поводу функции clear - ее задача экранировать недопустимые символы в атрибутах, раз у вас нет модуля xml.sax.saxutils, обойдемся без него
def clear(s): 
s = s.strip()
s = s.replace("&", "&amp;")
s = s.replace(">", "&gt;")
s = s.replace("<", "&lt;")
return s.replace('"', '&quot;')
Уфффф…. DIXI :)



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано (Ноя. 13, 2008 06:42:41)

Офлайн

#5 Ноя. 13, 2008 06:56:07

Vjn
От:
Зарегистрирован: 2008-11-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Сейчас обязательно попробую сделать как Вы посоветовали. У меня получилось формировать 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



Офлайн

#6 Ноя. 13, 2008 07:07:45

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

_Люди помогите с XML

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)

Офлайн

#7 Ноя. 13, 2008 09:42:52

Vjn
От:
Зарегистрирован: 2008-11-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Ругается на
Doc = msxml2.DOMDocument()



Офлайн

#8 Ноя. 13, 2008 10:08:15

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Vjn
from string import split
все же какая версия питона?



Офлайн

#9 Ноя. 13, 2008 10:35:50

Vjn
От:
Зарегистрирован: 2008-11-12
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Версия Питона 1.5



Офлайн

#10 Ноя. 13, 2008 10:38:25

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

_Люди помогите с XML

Vjn
Ругается на
Doc = msxml2.DOMDocument()
Как именно ругается? Я надеюсь вы import msxml2 поместили до Doc = msxml2.DOMDocument()?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version