【问题标题】:Generate XML Document in Python 3 using Namespaces and ElementTree使用命名空间和 ElementTree 在 Python 3 中生成 XML 文档
【发布时间】:2020-10-17 21:51:00
【问题描述】:

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

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

感谢任何帮助。

我为 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")

【问题讨论】:

标签: python xml elementtree xml-namespaces


【解决方案1】:

我相信你想多了。

在您的代码中注册默认命名空间可避免使用 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>

【讨论】:

  • 非常感谢,这正是我所希望的解决方案。简洁,容易和pythonic。我对 write 方法中的“default_namespace”选项感到困惑,该选项会干扰其余部分。当按照您的建议使用时,您必须在 write 方法中省略 default_namespace 选项。
  • 谢谢!这对我很有帮助。如何添加 xml 版本和编码值?
  • @BernardoTroncoso 当调用element_tree.write() 时设置xml_declaration=True
  • 好的,谢谢!我已经想通了!谢谢:)
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2013-01-28
相关资源
最近更新 更多