使用 Namespaces 和 ElementTree 在 Python 3 中生成 XML 文档



我在使用 Python 3 中的 ElementTree 框架生成 XML 文档时遇到问题。我尝试在设置文档之前注册命名空间。现在看来,我只能通过将命名空间添加到每个元素来生成 XML 文档,例如a=Element("{full_namespace_URI}element_name")这似乎很乏味。

如何设置默认命名空间并省略将其放入每个元素?

任何帮助,不胜感激。

我为 Python 3 编写了一个小型演示程序:

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:别名。

通过注册创建文档时将使用的任何命名空间,可以指定用于每个命名空间的别名。

要实现所需的输出,请将命名空间分配给 top 元素:

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>

相关内容

  • 没有找到相关文章

最新更新