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.bitscn.com”)
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 = “\t”, newl = “\n”, encoding = “utf-8”))
f.close()

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

代码如下:

hamlet
william shakespeare

当然一旦你掌握了这些基本方法之后,我们可以用一个类来更好的完成,这个类我们称之为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 = “\t”, newl = “\n”, 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.bitscn.com”)
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文件,如下:

代码如下:

hamlet
william shakespeare
$20
good

shuihu
naian shi
$200
good

这个版本算一个稍微高级的版本,但由于时间有限还很显得粗糙,读者可以发挥出更好的。

Posted in 未分类

发表评论