Vjn
Ноя. 12, 2008 07:54:42
Не могу сделать следующее: имеется txt файл такого содержания
дата рождения|ФИО
дата рождения|ФИО
дата рождения|ФИО
дата рождения|ФИО
…………………………
…………………………
Как мне в Python создать XML на основе данных этого файла?
PooH
Ноя. 12, 2008 09:27:18
Читайте построчно и пишите в другой текстовый файл :)
а вообще - вы бы хоть структуру входного файла полностью привели и DTD или схему для xml
Vjn
Ноя. 12, 2008 10:57:16
..задача следующая. мне нужно написать питон-сценарий который будет читать текстовый файл построчно и формировать XML, вот такого вида:
<DATA>
<RECORD DATE=“дата рождения1” FIO=“ФИО1”/>
<RECORD DATE=“дата рождения2” FIO=“ФИО2”/>
<RECORD DATE=“дата рождения3” FIO=“ФИО3”/>
<RECORD DATE=“дата рождения4” FIO=“ФИО4”/>
</DATA>
..этот питон скрип будут использоваться в системе транспортировки сообщений между подсистемами..
Пример имеющегося питон сценария:
# *************************************************************
# Разбор входящих переводов формата Z и H и преобразование
# их в формат XML для импорта в систему
# Формируется XML сообщение формы “ZH”, независимо от типа.
# Обработка сообщения в зависимости от типа осуществляется
# в процедуре импорта данного макета. Для импорта используется пакет M_PkgIEZH.
# Каждая строчка Z или H файла преобразуется в отдельное XML-сообщение.
# *************************************************************
from Colvir import *
import re
import cssutil
from string import split
fld = {}
fld = ‘FRMT’
# 03-телеграмма
# 05-обычный перевод на физическое или юридическое лицо
# 06-перевод для пополнения карт-счета
fld = ‘REFER’
fld = ‘MSGTYPE’
fld = ‘DEP’
fld = ‘PAY’
fld = ‘ACL’
fld = ‘KOD’
fld = ‘R_DEP’
fld = ‘R_NAMECR’
fld = ‘KBE’
fld = ‘R_ACR’
fld = ‘SUM’
fld = ‘KNP’
fld = ‘DORD’
fld = ‘VO’
# 1-перевод
# 2-возврат перевода
# 3-запрос по счету
# 4-отказ по запросу счета
# 5-предварительный запрос со счета
# 6-ответ на предварительный запрос со счета.
# 7-запрос со счета с последующим закрытием.
fld = ‘DSCR’
fld = ‘JURFL’
# 0-физическое лицо
# 1-юридическое лицо
fld = ‘VAL’
fld = ‘RNN_CL’
fld = ‘R_RNNCR’
fld = ‘PASSPORT_CL’
fld = ‘ADDRESS_CL’
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', ‘ZH’) #frmt+sl)
root_node.setAttribute('SENDER', ‘RTL00’+sl)
root_node.setAttribute('RECIPIENT', ‘RTL00’+sl)
root_node.setAttribute('TIME', time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())))
Doc.appendChild(root_node)
node = Doc.createElement('MEMBER')
root_node.appendChild(node)
for i in range(0, len(sl)-1):
if fld.has_key(i):
node.setAttribute(fld, sl)
# добавляем необходимое для LoadFromXML c_bsord-a
node.setAttribute('TUS', ‘AMANAT’)
node.setAttribute('ORD', ‘M_ORDINPAY’)
node.setAttribute('NN', ‘1’)
node.setAttribute('ZO', ‘0’)
attrDS = outDs
attrDS.append()
attrDS = frmt+sl
attrDS = ‘RTL00’+sl
attrDS = ‘RTL00’+sl
outDs = Doc.xml
del root_node
del Doc
PooH
Ноя. 12, 2008 12:02:43
Боже!!! Да зачем же так сложно!!!
#!/usr/bin/env python
import sys
from xml.sax.saxutils import escape
def clear(s):
return escape(s.strip()).replace('"', '"')
outf = sys.stdout #перенаправте вывод в файл open('<имя файла>', 'w')
outf.write('<DATA>')
for s in open(sys.argv[1]):
outf.write('<RECORD DATE="%s" FIO="%s"/>' % tuple(clear(x) for x in s.split('|')))
outf.write('</DATA>')
Vjn
Ноя. 12, 2008 12:46:38
у меня на вход подаётся переменная msg со значением - данные текстового файла
msg = inDs
…и вот эту структуру на выходе надо оставить
attrDS = outDs
attrDS.append()
attrDS = frmt+sl
attrDS = ‘RTL00’+sl
attrDS = ‘RTL00’+sl
outDs = Doc.xml
то есть сообщение садится в БД не могу понять как мне переделать ваш пример.
Извиняюсь, но с Питоном впервые сталкиваюсь…
PooH
Ноя. 12, 2008 13:17:26
Ну, где-то так:
#до этого момента пропущено
# формирование выходного XML-я.
from xml.sax.saxutils import escape
from cStringIO import StringIO
def clear(s):
return escape(s.strip()).replace('"', '"')
doc = StringIO()
doc.write('<DATA>')
for s in str_lst:
doc.write('<RECORD DATE="%s" FIO="%s"/>' % tuple(clear(x) for x in s.split('|')))
doc.write('</DATA>')
attrDS = outDs['TRATTR']
attrDS.append()
attrDS['FORMNAME'] = frmt+sl[0]
attrDS['SENDER'] = 'RTL00'+sl[3]
attrDS['RECIPIENT'] = 'RTL00'+sl[7]
outDs['BODY'] = doc.getvalue()
doc.close()
но вы не дали формат входного msg, а судя по коду он сложнее чем просто строки с данными.
Vjn
Ноя. 12, 2008 13:26:25
Что в предыдущем коде что в этом ругается на одну и ту же строку:
….
doc.write('<RECORD DATE=“%s” FIO=“%s”/>' % tuple(clear(x) for x in s.split('|')))
….
а именно на оператор “for”
PooH
Ноя. 12, 2008 13:36:22
Vjn
Что в предыдущем коде что в этом ругается на одну и ту же строку:
….
doc.write('<RECORD DATE=“%s” FIO=“%s”/>' % tuple(clear(x) for x in s.split('|')))
….
а именно на оператор “for”
Версия питона старовата, не понимает генераторы. Dimka665 правильно посоветовал
Vjn
Ноя. 12, 2008 13:39:45
Я и так пробовал - всё ровно не работает - та же ошибка…
кстати модуля “xml.sax.saxutils” у меня нет :(