首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用命名空间和ElementTree在Python3中生成XML文档

使用命名空间和ElementTree在Python3中生成XML文档
EN

Stack Overflow用户
提问于 2020-06-27 19:12:50
回答 1查看 190关注 0票数 0

我在Python3中使用ElementTree框架生成XML文档时遇到了问题。我尝试在设置文档之前注册名称空间。现在,我似乎只能通过向每个元素添加名称空间来生成XML文档,比如a=Element("{full_namespace_URI}element_name"),这似乎很繁琐。

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

任何帮助都是非常感谢的。

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

代码语言:javascript
运行
复制
    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")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-27 20:02:05

我相信你想得太多了。

在代码中注册默认命名空间可避免ns0:别名。

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

要获得所需的输出,请将名称空间分配给顶级元素:

a = ET.Element("{urn:dslforum-org:service-1-0}topNode")

前面的ET.register_namespace("", "urn:dslforum-org:service-1-0")将使该名称空间成为文档中的默认名称空间,并将其分配给topNode,并且不为您的标记名添加前缀。

代码语言:javascript
运行
复制
<?xml version='1.0' encoding='utf-8'?>
<topNode xmlns="urn:dslforum-org:service-1-0"><childNode>content</childNode></topNode>

如果你移除register_namespace()调用,那么你会得到这个怪物:

代码语言:javascript
运行
复制
<?xml version='1.0' encoding='utf-8'?>
<ns0:topNode xmlns:ns0="urn:dslforum-org:service-1-0"><childNode>content</childNode></ns0:topNode>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62609226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档