在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
这个版本算一个稍微高级的版本,但由于时间有限还很显得粗糙,读者可以发挥出更好的。