Найти - Пользователи
Полная версия: добавить объявление типа xml-документа
Начало » Python для новичков » добавить объявление типа xml-документа
1
zlodiak
помогите пожалуйста понять как в 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>
...............
.....

в python2 это делается без проблем так:
xmlPretty = etree.tostring(tree, pretty_print=True, xml_declaration=True,  encoding='utf-8')

но в python3 вместо etree.tostring используется etree.tounicode и она не имеет аргумента xml_declaration. (при попытке использовать этот аргумент получаю сообщение об ошибке)

на stackoverflow говорят, что во 2 и 3 питоне нужно использовать etree.tostring
Budulianin
zlodiak
но в python3 вместо etree.tostring используется etree.tounicode

Python 3.3.2+

>>> 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/>"

для записи байтов, нужно открыть файл ‘wb’

или так

>>> xml_declaration = '<?_xml version="1.0" encoding="utf-8"?>'
>>> fout.write(e.tounicode(h, doctype=xml_declaration))

zlodiak
etree.tounicode и она не имеет аргумента xml_declaration
Дело в том, что в юникоде нет смысла вставлять такую строку, которая имеет отношение к кодировке, поэтому такого параметра в etree.tounicode нет.
zlodiak
в 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)

Budulianin
zlodiak

tounicode вообще считается устаревшей

fout.write(
    os.linesep.join([
        xml_declaration,
        etree.tostring(
            xml,
            encoding='unicode',
        ),
    ])
)
zlodiak

Budulianin
zlodiak

Тебе же интерпретатор почти по-русски написал

Не используй табы для отступов, только 4 пробела

open('output.txt', 'w'
Singularity
Budulianin
почти по-русски
такая уже маленькая разница ?
Budulianin
Singularity

Это тот бендер на аватаре спрашивает?
zlodiak
ребят, я всё равно не понимаю, поясните пожалуйста. табы заменил напробелы, теперь получаю такое сообщение:


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
Для продолжения нажмите любую клавишу . . .
Budulianin
zlodiak
TypeError: ‘str’ does not support the buffer int

если ты открыл файл в текстовом режиме, то тебе нужно передавать в функцию юникод, если в бинарном ‘wb’, то байты

А ты открыл в ‘wb’ и передаёшь юникод

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',
            ),
        ])
    )
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