Добавить пространство имен в документ KML в Python LXML - PullRequest
0 голосов
/ 04 ноября 2019

Я читаю эту ссылку в Google Extension:

https://developers.google.com/kml/documentation/kml

Поскольку мне нужно использовать элемент с префиксом gx gx: drawOrder, мне нужно обновить пространства имен до:

<kml xmlns="http://www.opengis.net/kml/2.2"
  xmlns:gx="http://www.google.com/kml/ext/2.2">

Я пытался сначала идентифицировать Элемент, затем использовал .set, но не работал.

Может кто-нибудь помочь, пожалуйста?

Это то, чтопервые 2 строки моего KML выглядят так:

<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">

Я думал, что будет просто изменить первую строку.

1 Ответ

2 голосов
/ 04 ноября 2019

Когда вы добавляете новый элемент, связанный с другим пространством имен, объявление для этого пространства имен будет вставлено автоматически при сериализации файла XML. По умолчанию объявление не отображается в корневом элементе, и префикс может не соответствовать желаемому.

Демонстрация:

from lxml import etree

# Parse original XML
orig_xml = '<kml xmlns="http://www.opengis.net/kml/2.2"/>'
root = etree.fromstring(orig_xml)

ns = "http://www.google.com/kml/ext/2.2"

# Add new element in other namespace as child of root
test = etree.SubElement(root, etree.QName(ns, "drawOrder"))

print(etree.tostring(root, pretty_print=True).decode())

Вывод:

<kml xmlns="http://www.opengis.net/kml/2.2">
  <ns0:drawOrder xmlns:ns0="http://www.google.com/kml/ext/2.2"/>
</kml>

Это очень хороший, правильно сформированный XML-документ, но он, вероятно, не совсем то, что вам нужно. Это можно исправить с помощью cleanup_namespaces(). Добавьте следующую строку перед вызовом print():

etree.cleanup_namespaces(root, top_nsmap={"gx": ns})

Новый вывод:

<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
  <gx:drawOrder/>
</kml>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...