在 Python LXML 中的 KML 文档中添加命名空间
Add a namespace in a KML document in Python LXML
我正在 Google 上阅读此参考资料 分机:
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,但没有成功。
有人可以帮忙吗?
我的 KML 的前两行如下所示:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">
我认为更改第一行是一项简单的工作。
当您添加绑定到另一个命名空间的新元素时,将在序列化 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>
我正在 Google 上阅读此参考资料 分机:
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,但没有成功。
有人可以帮忙吗?
我的 KML 的前两行如下所示:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">
我认为更改第一行是一项简单的工作。
当您添加绑定到另一个命名空间的新元素时,将在序列化 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>