最近写程序需要用到xml操作,看了看python.org上面的几个xml类库,还是一头雾水,感觉太学术化了,都那么吝惜写几个例子。所以自己整理了一下,算是个小总结,和大家分享一下吧。
对于简单的操作xml文件来说,xml.dom.minidom足以,可以写可以读的。
先给出示例程序,然后简单注释一下
1.示例程序:
-----------------------------------------------------------------------------------------------------------------
1 #Author: Nonove. nonove[at]msn[dot]com
2 #XML simple operation Examples and functions
3 #encoding = gbk
4
5 from xml.dom importminidom6 importcodecs7
8
9 def write_xml_file(path, xmlDom, option = {'encoding':'utf-8'}):10 """Generate xml file with writer11 params:12 string path xml file path13 Dom xmlDom xml dom14 dictionary option writer option {'indent': '', 'addindent':' ', 'newl':'\n', 'encoding':'utf-8'}15 returns:16 bool success return True else False17 """
18 defaultOption = {'indent': '', 'addindent':' ', 'newl':'\n', 'encoding':'utf-8'}19 for k, v indefaultOption.iteritems():20 if k not inoption:21 option[k] =v22
23 try:24 f=file(path, 'wb')25 writer = codecs.lookup(option['encoding'])[3](f)26 xmlDom.writexml(writer, encoding = option['encoding'], indent = option['indent'], \27 addindent = option['addindent'], newl = option['newl'])28 writer.close()29 returnTrue30 except:31 print('Write xml file failed.... file:{0}'.format(path))32 returnFalse33
34
35
36 if __name__ == "__main__":37 #Create a xml dom
38 xmlDom =minidom.Document()39 nonove = xmlDom.createElement('nonove')40 xmlDom.appendChild(nonove)41
42 #Generate a xml dom
43 #Create child node, textnode, set attribute, appendChild
44 for i in range(3):45 node = xmlDom.createElement('node')46 node.setAttribute('id', str(i))47 node.setAttribute('status', 'alive')48 textNode = xmlDom.createTextNode('node value' +str(i))49 node.appendChild(textNode)50 nonove.appendChild(node)51
52 #Print xml dom
53 #Print simple xml
54 ## print(xmlDom.toxml())
55 #Print pretty xml
56 print('\n' + xmlDom.toprettyxml(indent=' '))57
58 #Save xml file with encoding utf-8
59 option = {'indent': '', 'addindent':'', 'newl':'', 'encoding':'utf-8'}60 write_xml_file('nonove.xml', xmlDom, option)61
62 #Load xml dom from file
63 xmlDom = minidom.parse('nonove.xml')64 #Get nonove node
65 nonove = xmlDom.getElementsByTagName('nonove')[0]66 #Get node list
67 nodes = xmlDom.getElementsByTagName('node')68 for node innodes:69 #Get node attribute id
70 nodeid = node.getAttribute('id')71 #Print node id and textnode value
72 print('Node id: {0} textnode value: {1}'.format(nodeid, node.firstChild.nodeValue))73
74 for node innodes:75 #Set attribute or remove attribute
76 node.setAttribute('author', 'nonove')77 node.removeAttribute('status')78
79 #Remove node 1
80 nonove.removeChild(nodes[1])81
82 print('\n' + xmlDom.toprettyxml(indent=' '))
------------------------------------------------------------------------------------------------------------------
2.注释:
#读取xml方式有两种 从文件 和 从字符串
xmlDom =
minidom.parse('nonove.xml')
xmlDom = minidom.parseString(xmlstring)
#创建xml dom
主要是用到了minidom.Document()
xmlDom =
minidom.Document()
#创建/删除节点
node =
xmlDom.createElement('node')
root.removeChild(node)
#创建Text Node,获取 node value
textnode =
xmlDom.createTextNode('set value here')
value = textnode.nodeValue
#添加/删除node属性node.setAttribute('author',
'nonove')
node.removeAttribute('author')
#保存xml文件用到了codecs类库和writexml()函数,例子里面我写了个函数,把略显复杂的操作封装了一下,以后可以方便重用。
write_xml_file(path, xmlDom,
option)path:xml文件保存地址
xmlDom: xml document
option:
是dictionary类型变量,包括缩进和编码等,这个可以方便的把xml文件按utf-8或者gb2312保存,方便。
3.备注:
关于CharacterData的解析不出来的问题解决办法:标签和两面的节点不能够有间隔字符,否则就解析为空。
就先总结了这么多,有什么不对的地方或者更好的方法请赐教啊……