zoukankan      html  css  js  c++  java
  • Python中使用dom模块生成XML文件示例

      在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件。

      在生成XML文件中,我们主要使用下面的方法来完成。

      主要方法

      1、生成XML节点(node)

    createElement("node_name")
    

      2、给节点添加属性值(Attribute)

    node.setAttribute("att_name", "arr_value")
    

      3、节点的标签值(data)

    createTextNode("node_value")
    

      

      其中第1、3点在创建完节点(节点值)之后,还需使用下面的方法添加到指点的节点的位置下面

    prev_node.appendChild(cur_node)
    

      

    这里的prev_node要添加节点的上一层节点,而cur_node即为当前要添加的节点了。

    代码演示

    下面用代码来演示下如何使用Dom来生成XML,这个是简单版本,如下:

    '''
    Created on 2012-8-28  
      
     @author:  walfred 
     @module: domxml.genXML  
     @description: 
     '''  
     import xml.dom.minidom as Dom  
      
     if __name__ == "__main__":  
         doc = Dom.Document()  
         root_node = doc.createElement("book_store")  
         root_node.setAttribute("name", "newhua")  
         root_node.setAttribute("website", "http://www.jb51.net")  
         doc.appendChild(root_node)  
      
         book_node = doc.createElement("book1")  
      
         book_name_node = doc.createElement("name")  
         book_name_value = doc.createTextNode("hamlet")  
         book_name_node.appendChild(book_name_value)  
         book_node.appendChild(book_name_node)  
      
         book_author_node = doc.createElement("author")  
         book_author_value = doc.createTextNode("William Shakespeare")  
         book_author_node.appendChild(book_author_value)  
         book_node.appendChild(book_author_node)  
      
         root_node.appendChild(book_node)  
      
         f = open("book_store.xml", "w")  
         f.write(doc.toprettyxml(indent = "	", newl = "
    ", encoding = "utf-8"))  
         f.close()
    

      这个代码将在当前目录下生成一个book_store.xml文件,我把它也贴在下面:

    <?xml version="1.0" encoding="utf-8"?>  
     <book_store name="newhua" website="http://www.jb51.net">  
         <book1>  
             <name>hamlet</name>  
             <author>William Shakespeare</author>  
         </book1>  
     </book_store>
    

      当然一旦你掌握了这些基本方法之后,我们可以用一个类来更好的完成,这个类我们称之为XMLGenerator,代码如下:

    ''' 
    Created on 2012-8-28  
      
     @author:  walfred 
     @module: domxml.wXMLbyDom  
     @description: 
     '''  
     import xml.dom.minidom as Dom  
      
     class XMLGenerator:  
         def __init__(self, xml_name):  
             self.doc = Dom.Document()  
             self.xml_name = xml_name  
      
         def createNode(self, node_name):  
             return self.doc.createElement(node_name)  
      
         def addNode(self, node, prev_node = None):  
             cur_node = node  
             if prev_node is not None:  
                 prev_node.appendChild(cur_node)  
             else:  
                 self.doc.appendChild(cur_node)  
             return cur_node  
      
         def setNodeAttr(self, node, att_name, value):  
             cur_node = node  
             cur_node.setAttribute(att_name, value)  
      
         def setNodeValue(self, cur_node, value):  
             node_data = self.doc.createTextNode(value)  
             cur_node.appendChild(node_data)  
      
         def genXml(self):  
             f = open(self.xml_name, "w")  
             f.write(self.doc.toprettyxml(indent = "	", newl = "
    ", encoding = "utf-8"))  
             f.close()  
      
     if __name__ == "__main__":  
         myXMLGenerator = XMLGenerator("book_store.xml")  
      
         #xml root node  
         node_book_store = myXMLGenerator.createNode("book_store")  
         myXMLGenerator.setNodeAttr(node_book_store, "name", "new hua")  
         myXMLGenerator.setNodeAttr(node_book_store, "website", "http://www.jb51.net")  
         myXMLGenerator.addNode(node = node_book_store)  
      
         #book01  
         node_book_01 = myXMLGenerator.createNode("book")  
      
         node_book_01_name = myXMLGenerator.createNode("name")  
         myXMLGenerator.setNodeValue(node_book_01_name, "Hamlet")  
         myXMLGenerator.addNode(node_book_01_name, node_book_01)  
      
         node_book_01_author = myXMLGenerator.createNode("author")  
         myXMLGenerator.setNodeValue(node_book_01_author, "William Shakespeare")  
         myXMLGenerator.addNode(node_book_01_author, node_book_01)  
      
         node_book_01_price = myXMLGenerator.createNode("price")  
         myXMLGenerator.setNodeValue(node_book_01_price, "$20")  
         myXMLGenerator.addNode(node_book_01_price, node_book_01)  
      
         node_book_01_grade = myXMLGenerator.createNode("grade")  
         myXMLGenerator.setNodeValue(node_book_01_grade, "good")  
         myXMLGenerator.addNode(node_book_01_grade, node_book_01)  
      
         myXMLGenerator.addNode(node_book_01, node_book_store)  
      
         #book 02  
         node_book_02 = myXMLGenerator.createNode("book")  
      
         node_book_02_name = myXMLGenerator.createNode("name")  
         myXMLGenerator.setNodeValue(node_book_02_name, "shuihu")  
         myXMLGenerator.addNode(node_book_02_name, node_book_02)  
      
         node_book_02_author = myXMLGenerator.createNode("author")  
         myXMLGenerator.setNodeValue(node_book_02_author, "naian shi")  
         myXMLGenerator.addNode(node_book_02_author, node_book_02)  
      
         node_book_02_price = myXMLGenerator.createNode("price")  
         myXMLGenerator.setNodeValue(node_book_02_price, "$200")  
         myXMLGenerator.addNode(node_book_02_price, node_book_02)  
      
         node_book_02_grade = myXMLGenerator.createNode("grade")  
         myXMLGenerator.setNodeValue(node_book_02_grade, "good")  
         myXMLGenerator.addNode(node_book_02_grade, node_book_02)  
      
         myXMLGenerator.addNode(node_book_02, node_book_store)  
      
         #gen  
         myXMLGenerator.genXml()
    

      同样这个方法会在本目录下生成一个book_store.xml文件,如下:

    <?xml version="1.0" encoding="utf-8"?>  
     <book_store name="new hua" website="http://www.jb51.net">  
         <book>  
             <name>Hamlet</name>  
             <author>William Shakespeare</author>  
             <price>$20</price>  
             <grade>good</grade>  
         </book>  
         <book>  
             <name>shuihu</name>  
             <author>naian shi</author>  
             <price>$200</price>  
             <grade>good</grade>  
         </book>  
     </book_store>
    

      

      

  • 相关阅读:
    es6.8集群部署(ssl认证)+nfs备份(生产)
    spool
    dataguard unname
    zabbix监控mysql主从同步可用性
    企业微信发送消息
    安装ruby
    binlog2sql
    xtrabackup备份异地恢复+binlog日志应用
    5.7.29重新部署主从
    centos7 图形界面启动
  • 原文地址:https://www.cnblogs.com/MrFiona/p/6832883.html
Copyright © 2011-2022 走看看