Форум сайта python.su
0
помогите пожалуйста понять как в python3 добавляется объявление типа документа в xml-файл
например есть такая функция
def record_xml(xml, fileName='qwerty.xml'): try: with open(fileName, "wt") as file: file.write(xml) except OSError: print('Error') else: return True record_xml(xmlPretty)
<data> <item> <message>что с браузером</message> <section>Взаимопомощь</section> <date>05.07.2013</date> </item> ............... .....
<?_xml version="1.0" encoding="utf-8"?> <data> <item> <message>что с браузером</message> <section>Взаимопомощь</section> <date>05.07.2013</date> </item> ............... .....
xmlPretty = etree.tostring(tree, pretty_print=True, xml_declaration=True, encoding='utf-8')
Отредактировано zlodiak (Март 8, 2014 20:33:59)
Офлайн
33
zlodiak
но в python3 вместо etree.tostring используется etree.tounicode
>>> import lxml.etree as e >>> h = e.Element('html') >>> e.tostring(h, encoding='utf-8', xml_declaration=True) b"<?xml version='1.0' encoding='utf-8'?>\n<html/>"
>>> xml_declaration = '<?_xml version="1.0" encoding="utf-8"?>' >>> fout.write(e.tounicode(h, doctype=xml_declaration))
zlodiakДело в том, что в юникоде нет смысла вставлять такую строку, которая имеет отношение к кодировке, поэтому такого параметра в etree.tounicode нет.
etree.tounicode и она не имеет аргумента xml_declaration
Отредактировано Budulianin (Март 9, 2014 14:16:32)
Офлайн
0
в python 3/3/3 заработал такой вариант…
import lxml.etree def record_xml_to_file(xml, xml_declaration, fileName='qw.xml'): xmlPretty = lxml.etree.tounicode(xml, pretty_print=True) print(xmlPretty) try: with open(fileName, "wb") as file: #file.write(lxml.etree.tounicode(xml, doctype=xml_declaration)) file.write(bytes(lxml.etree.tounicode(xml, doctype=xml_declaration), 'UTF-8')) except OSError as exc: print('Error record. ', exc) else: return True xml_declaration = '<?xml version="1.0" encoding="utf-8"?>' xml = lxml.etree.Element('html') record_xml_to_file(xml, xml_declaration)
Отредактировано zlodiak (Март 9, 2014 14:19:33)
Офлайн
33
zlodiak
tounicode вообще считается устаревшей
fout.write( os.linesep.join([ xml_declaration, etree.tostring( xml, encoding='unicode', ), ]) )
Отредактировано Budulianin (Март 9, 2014 15:24:00)
Офлайн
0


Офлайн
33
zlodiak
Тебе же интерпретатор почти по-русски написал
Не используй табы для отступов, только 4 пробела
open('output.txt', 'w'…
Отредактировано Budulianin (Март 9, 2014 15:26:47)
Офлайн
75
Budulianinтакая уже маленькая разница ?
почти по-русски
Офлайн
33
Singularity
Офлайн
0
ребят, я всё равно не понимаю, поясните пожалуйста. табы заменил напробелы, теперь получаю такое сообщение:
Traceback (most recent call last):
File “q.py”, line 20, in <module>
record_xml_to_file(xml, xml_declaration)
File “q.py”, line 10, in record_xml_to_file
file.write('\n'.join([xml_declaration, lxml.
code',),]))
TypeError: ‘str’ does not support the buffer int
Для продолжения нажмите любую клавишу . . .
Отредактировано zlodiak (Март 9, 2014 15:40:28)
Офлайн
33
zlodiak
TypeError: ‘str’ does not support the buffer int
fout = open('output.txt', 'wb') fout.write('asdasd') TypeError: ‘str’ does not support the buffer int
with open(fileName, 'w', encoding='utf-8') as fout: fout.write( os.linesep.join([ xml_declaration, etree.tostring( xml, encoding='unicode', ), ]) )
Отредактировано Budulianin (Март 9, 2014 16:00:04)
Офлайн