使用命名空间和 ElementTree 在 Python 3 中生成 XML 文档
Generate XML Document in Python 3 using Namespaces and ElementTree
我在 Python 中使用 ElementTree 框架生成 XML 文档时遇到问题 3. 我尝试在设置文档之前注册名称空间。现在看来,我只能通过向每个元素添加名称空间来生成 XML 文档,例如 a=Element("{full_namespace_URI}element_name")
,这看起来很乏味。
如何设置默认命名空间并且可以省略将它放在每个元素中?
感谢任何帮助。
我已经为Python3写了一个小演示程序:
from io import BytesIO
from xml.etree import ElementTree as ET
ET.register_namespace("", "urn:dslforum-org:service-1-0")
"""
desired output
==============
<?xml version='1.0' encoding='utf-8'?>
<topNode xmlns="urn:dslforum-org:service-1-0"">
<childNode>content</childNode>
</topNode>
"""
# build XML document without namespaces
a = ET.Element("topNode")
b = ET.Element("childNode")
b.text = "content"
a.append(b)
tree = ET.ElementTree(a)
# build XML document with namespaces
a_ns = ET.Element("{dsl}topNode")
b_ns = ET.Element("{dsl}childNode")
b_ns.text = "content"
a_ns.append(b_ns)
tree_ns = ET.ElementTree(a_ns)
def print_element_tree(element_tree, comment, default_namespace=None):
"""
print element tree with comment to standard out
"""
with BytesIO() as buf:
element_tree.write(buf, encoding="utf-8", xml_declaration=True,
default_namespace=default_namespace)
buf.seek(0)
print(comment)
print(buf.read().decode("utf-8"))
print_element_tree(tree, "Element Tree without XML namespace")
print_element_tree(tree_ns, "Element Tree with XML namespace", "dsl")
我相信你想多了。
在您的代码中注册默认名称空间可避免 ns0:
别名。
注册您将在创建文档时使用的任何命名空间,允许您指定用于每个命名空间的别名。
要获得所需的输出,请将命名空间分配给您的顶级元素:
a = ET.Element("{urn:dslforum-org:service-1-0}topNode")
前面的 ET.register_namespace("", "urn:dslforum-org:service-1-0")
将使它成为文档中的默认命名空间,将其分配给 topNode
,而不是标记名称的前缀。
<?xml version='1.0' encoding='utf-8'?>
<topNode xmlns="urn:dslforum-org:service-1-0"><childNode>content</childNode></topNode>
如果你删除 register_namespace()
调用,那么你会得到这个怪物:
<?xml version='1.0' encoding='utf-8'?>
<ns0:topNode xmlns:ns0="urn:dslforum-org:service-1-0"><childNode>content</childNode></ns0:topNode>
我在 Python 中使用 ElementTree 框架生成 XML 文档时遇到问题 3. 我尝试在设置文档之前注册名称空间。现在看来,我只能通过向每个元素添加名称空间来生成 XML 文档,例如 a=Element("{full_namespace_URI}element_name")
,这看起来很乏味。
如何设置默认命名空间并且可以省略将它放在每个元素中?
感谢任何帮助。
我已经为Python3写了一个小演示程序:
from io import BytesIO
from xml.etree import ElementTree as ET
ET.register_namespace("", "urn:dslforum-org:service-1-0")
"""
desired output
==============
<?xml version='1.0' encoding='utf-8'?>
<topNode xmlns="urn:dslforum-org:service-1-0"">
<childNode>content</childNode>
</topNode>
"""
# build XML document without namespaces
a = ET.Element("topNode")
b = ET.Element("childNode")
b.text = "content"
a.append(b)
tree = ET.ElementTree(a)
# build XML document with namespaces
a_ns = ET.Element("{dsl}topNode")
b_ns = ET.Element("{dsl}childNode")
b_ns.text = "content"
a_ns.append(b_ns)
tree_ns = ET.ElementTree(a_ns)
def print_element_tree(element_tree, comment, default_namespace=None):
"""
print element tree with comment to standard out
"""
with BytesIO() as buf:
element_tree.write(buf, encoding="utf-8", xml_declaration=True,
default_namespace=default_namespace)
buf.seek(0)
print(comment)
print(buf.read().decode("utf-8"))
print_element_tree(tree, "Element Tree without XML namespace")
print_element_tree(tree_ns, "Element Tree with XML namespace", "dsl")
我相信你想多了。
在您的代码中注册默认名称空间可避免 ns0:
别名。
注册您将在创建文档时使用的任何命名空间,允许您指定用于每个命名空间的别名。
要获得所需的输出,请将命名空间分配给您的顶级元素:
a = ET.Element("{urn:dslforum-org:service-1-0}topNode")
前面的 ET.register_namespace("", "urn:dslforum-org:service-1-0")
将使它成为文档中的默认命名空间,将其分配给 topNode
,而不是标记名称的前缀。
<?xml version='1.0' encoding='utf-8'?>
<topNode xmlns="urn:dslforum-org:service-1-0"><childNode>content</childNode></topNode>
如果你删除 register_namespace()
调用,那么你会得到这个怪物:
<?xml version='1.0' encoding='utf-8'?>
<ns0:topNode xmlns:ns0="urn:dslforum-org:service-1-0"><childNode>content</childNode></ns0:topNode>