Найти - Пользователи
Полная версия: _Люди помогите с XML
Начало » Python для экспертов » _Люди помогите с XML
1 2 3
Vjn
Опишу ещё раз для чего всё это надо!

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

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

# разбиение пакетов на отдельные сообщения и выделение основных реквизитов:
# Эти реквизиты являются !ОБЯЗАТЕЛЬНЫМИ!
# ‘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
igor.kaist
а что за модуль Colvir? Если нет xml.sax.saxutils то необходимо поставить питон поновее.
Что то у вас запутано очень все… я раз 5 прочитал последний пост, так и не смог все связать воедино :)
PooH
igor.kaist
а что за модуль Colvir?
Скрипт вызывается из внешней системы. Это явно модуль связи с ней
PooH
Поймите, полностью задачу за вас никто не решит. И тем более не отладит в вашем окружении. Еще и не зная версию 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 :)
Vjn
Сейчас обязательно попробую сделать как Вы посоветовали. У меня получилось формировать 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
PooH
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
Vjn
Ругается на
Doc = msxml2.DOMDocument()
igor.kaist
Vjn
from string import split
все же какая версия питона?
Vjn
Версия Питона 1.5
PooH
Vjn
Ругается на
Doc = msxml2.DOMDocument()
Как именно ругается? Я надеюсь вы import msxml2 поместили до Doc = msxml2.DOMDocument()?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB