zoukankan      html  css  js  c++  java
  • 【python】lxml中多个xml采用相同节点时出现的问题

    今天突然发现了一个lxml的坑。

    假设我们有一个节点

    <id>123</id>

    有两个父节点都要用上述节点,则必须把上面的节点写两遍!用同一个会出错!

    出错例子:

    #!/usr/bin/env python
    #encoding:utf8
    
    from lxml import etree
    
    if __name__ == "__main__":
        
        root1 = etree.Element("root1")  #根节点1
        root2 = etree.Element("root2")  #根节点2
        ver_node = etree.Element("id")  #子节点
        ver_node.text = "123"
        
        root1.append(ver_node)  #都加入了同一个子节点
        root2.append(ver_node)
        
        print etree.tostring(root1, pretty_print=True, xml_declaration=True, encoding='UTF-8')
        print etree.tostring(root2, pretty_print=True, xml_declaration=True, encoding='UTF-8')

    结果:

    <?xml version='1.0' encoding='UTF-8'?>
    <root1/>
    
    <?xml version='1.0' encoding='UTF-8'?>
    <root2>
      <id>123</id>
    </root2>

    只有后面一个有子节点,前面一个没有!

    正确写法:

    #!/usr/bin/env python
    #encoding:utf8
    from lxml import etreeimport copy
    
    if __name__ == "__main__":
        root1 = etree.Element("root1")
        root2 = etree.Element("root2")
        ver_node1 = etree.Element("id")
        ver_node1.text = "123"
        ver_node2 = copy.deepcopy(ver_node1) #深拷贝!
        
        root1.append(ver_node1)
        root2.append(ver_node2)
        
        print etree.tostring(root1, pretty_print=True, xml_declaration=True, encoding='UTF-8')
        print etree.tostring(root2, pretty_print=True, xml_declaration=True, encoding='UTF-8')

    结果:

    <?xml version='1.0' encoding='UTF-8'?>
    <root1>
      <id>123</id>
    </root1>
    
    <?xml version='1.0' encoding='UTF-8'?>
    <root2>
      <id>123</id>
    </root2>
  • 相关阅读:
    第24天:Python 标准库概览2
    第23天:Python 标准库概览1
    第22天:Python NameSpace&Scope
    第21天: Web 开发 Jinja2 模板引擎
    第20天:Python 之装饰器
    第19天:Python 之迭代器
    第18天:Python 高阶函数
    第17天:Python 函数之参数
    第16天:Python 错误和异常
    第15天:Python set
  • 原文地址:https://www.cnblogs.com/dplearning/p/5801867.html
Copyright © 2011-2022 走看看