python l xml pkg - как инкрементно записать в файл XML с использованием etree.xmlfile И передать существующие элементы? - PullRequest
1 голос
/ 18 марта 2020

очень новое для всего, что связано xml, пожалуйста, потерпите меня - я пытаюсь создать код, который преобразует растры в файлы KML для Google Планета Земля.

Я обнаружил пакет lxml, который сделал моя жизнь стала проще, но теперь я столкнулся с проблемой.

Допустим, я создал элемент с именем kml с пространствами имен:

from lxml import etree

version = '2.2'

namespace_hdr = {'gx':f'http://www.google.com/kml/ext/{version}',
                 'kml':f'http://www.opengis.net/kml/{version}',
                 'atom':f'http://www.w3.org/2005/Atom'
                 }

kml = etree.Element('kml', nsmap=namespace_hdr)

И я также создал элемент с именем Document:

Document = etree.SubElement(kml, 'Document')

Теперь .. У меня есть много данных, которые я хочу записать, и у меня возникают проблемы с памятью, поэтому я решил, что наилучшим подходом будет сгенерировать мои данные для записи на лету и записать их, как я go, следовательно, инкрементная запись.

Я использую следующий подход:

out_file = 'test.kml'

with etree.xmlfile(out_file, encoding='utf-8') as xf:
        xf.write_declaration()
        with xf.element(kml):
            xf.write(Document)

, который возвращает ошибку:

TypeError: Argument must be bytes or unicode, got '_Element'

Если я изменяю kml для 'kml' он работает нормально, но, очевидно, не записывает пространства имен в файл, который я определил в элементе kml.

Как можно передать элемент kml вместо строки? Есть ли способ сделать это? Или какой-то другой способ пошаговой записи в файл?

Любые мысли приветствуются.

FYI - вывод при использовании 'kml':

<?xml version='1.0' encoding='utf-8'?>
<kml><Document/>
</kml>

I ' Я пытаюсь достичь того же, но с пространствами имен:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document/>
</kml>
...