очень новое для всего, что связано 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>