Форум сайта python.su
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png) 
			 
							 0
  0   
								
								Не могу сделать следующее: имеется txt файл такого содержания
дата рождения|ФИО
дата рождения|ФИО
дата рождения|ФИО
дата рождения|ФИО
…………………………
…………………………
Как мне в Python создать XML на основе данных этого файла?
Офлайн
 
							 72
  72   
								
								Читайте построчно и пишите в другой текстовый файл :)
а вообще - вы бы хоть структуру входного файла полностью привели и DTD или схему для xml
Офлайн
 
							 0
  0   
								
								..задача следующая. мне нужно написать питон-сценарий который будет читать текстовый файл построчно и формировать 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
Офлайн
 
							 72
  72   
								
								Боже!!! Да зачем же так сложно!!!
#!/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>')
Отредактировано (Ноя. 12, 2008 12:09:13)
Офлайн
 
							 0
  0   
								
								у меня на вход подаётся переменная msg со значением - данные текстового файла
msg = inDs
…и вот эту структуру на выходе надо оставить
  attrDS = outDs
  attrDS.append()
  attrDS = frmt+sl
  attrDS = ‘RTL00’+sl
  attrDS = ‘RTL00’+sl
  outDs = Doc.xml
то есть сообщение садится в БД не могу понять как мне переделать ваш пример.
Извиняюсь, но с Питоном впервые сталкиваюсь…
Офлайн
 
							 72
  72   
								
								Ну, где-то так:
#до этого момента пропущено
# формирование выходного 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()
Отредактировано (Ноя. 12, 2008 13:19:43)
Офлайн
 
							 0
  0   
								
								Что в предыдущем коде что в этом ругается на одну и ту же строку:
….
doc.write('<RECORD DATE=“%s” FIO=“%s”/>' % tuple(clear(x) for x in s.split('|')))
….
а именно на оператор “for”
Офлайн
 
							 0
  0   
								
								Vjn
doc.write('<RECORD DATE=“%s” FIO=“%s”/>' % tuple([clear(x) for x in s.split('|')]))
Офлайн
 
							 72
  72   
								
								VjnВерсия питона старовата, не понимает генераторы. Dimka665 правильно посоветовал
Что в предыдущем коде что в этом ругается на одну и ту же строку:
….
doc.write('<RECORD DATE=“%s” FIO=“%s”/>' % tuple(clear(x) for x in s.split('|')))
….
а именно на оператор “for”
Офлайн
 
							 0
  0   
								
								Я и так пробовал - всё ровно не работает - та же ошибка…
кстати модуля “xml.sax.saxutils” у меня  нет    :(
Офлайн
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png)