由於小編的系統需要進程間通信,想通過對Xml文件操作,來進行信息交互,於是寫了一組相關的類。
xml文件:
<?xml version='1.0' encoding='utf-8'?>
<flags>
<flag name="execute" value="false" />
<flag name="other" value="value" />
</flags>
在寫增刪改差前,先封裝了一組Xml方法
#!usr/bin/env python
#coding:utf-8
__author__='fangtao'
from xml.etree.ElementTree import ElementTree,Element
class XmlDao():
@staticmethod
def openXml(filename):
tree = ElementTree()
tree.parse(filename)
return tree
@staticmethod
def saveAs(tree,outfile):
tree.write(outfile, encoding="utf-8",xml_declaration=True)
@staticmethod
def add_child_node(nodelist, element):
'''給一個節點添加子節點
nodelist: 節點列表
element: 子節點'''
print len(nodelist)
print element
for node in nodelist:
node.append(element)
@staticmethod
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
'''同過屬性及屬性值定位一個節點,並刪除之
nodelist: 父節點列表
tag:子節點標籤
kv_map: 屬性及屬性值列表'''
for parent_node in nodelist:
children = parent_node.getchildren()
for child in children:
if child.tag == tag and XmlDao.if_match(child, kv_map):
parent_node.remove(child)
@staticmethod
def create_node(tag, property_map, content=''):
'''新造一個節點
tag:節點標籤
property_map:屬性及屬性值map
content: 節點閉合標籤裏的文本內容
return 新節點'''
element = Element(tag, property_map)
element.text = content
return element
@staticmethod
def change_node_text(nodelist, text, is_add=False, is_delete=False):
'''改變/增加/刪除一個節點的文本
nodelist:節點列表
text : 更新後的文本'''
for node in nodelist:
if is_add:
node.text += text
elif is_delete:
node.text = ""
else:
node.text = text
@staticmethod
def change_node_properties(nodelist, kv_map, is_delete=False):
'''修改/增加 /刪除 節點的屬性及屬性值
nodelist: 節點列表
kv_map:屬性及屬性值map'''
for node in nodelist:
for key in kv_map:
if is_delete:
if key in node.attrib:
del node.attrib[key]
else:
node.set(key, kv_map.get(key))
@staticmethod
def get_node_by_keyvalue(nodelist, kv_map):
'''根據屬性及屬性值定位符合的節點,返回節點
nodelist: 節點列表
kv_map: 匹配屬性及屬性值map'''
result_nodes = []
for node in nodelist:
if XmlDao.if_match(node, kv_map):
result_nodes.append(node)
return result_nodes
@staticmethod
def find_nodes(tree, path):
'''查找某個路徑匹配的所有節點
tree: xml樹
path: 節點路徑'''
return tree.findall(path)
@staticmethod
def if_match(node, kv_map):
'''判斷某個節點是否包含所有傳入參數屬性
node: 節點
kv_map: 屬性及屬性值組成的map'''
for key in kv_map:
if node.get(key) != kv_map.get(key):
return False
return True
如果有自己的需要,也可以自己拿着類庫直接使用,然後,寫了一組API才做上面的Xml文件。
#!usr/bin/env python
#coding:utf-8
import XmlDao
class FlagDao():
def __init__(self,filename=None):
if filename is None:
self.__filename = '../grapdata/flag.xml'
else:
self.__filename = filename
#獲取節點屬性
def getValueByName(self,name):
tree = XmlDao.openXml(self.__filename)
print 'tree',tree,self.__filename
if tree is None:
return None
nodes = XmlDao.find_nodes(tree, 'flag')
nodes = XmlDao.get_node_by_keyvalue(nodes, {'name':name})
if len(nodes) > 0:
return nodes[0].attrib['value']
return None
#設置節點
def setValueByName(self,name,value):
tree = XmlDao.openXml(self.__filename)
if tree is None:
return None
nodes = XmlDao.find_nodes(tree, 'flag')
nodes = XmlDao.get_node_by_keyvalue(nodes, {'name':name})
if len(nodes) > 0:
nodes[0].attrib['value'] = value
XmlDao.saveAs(tree, self.__filename)
#添加節點
def addTag(self,name,value):
tree = XmlDao.openXml(self.__filename)
XmlDao.add_child_node([tree.getroot()],XmlDao.create_node('flag', {'name':name,'value':value}))
XmlDao.saveAs(tree, self.__filename)
#刪除節點
def deleteTagByName(self,name):
tree = XmlDao.openXml(self.__filename)
XmlDao.del_node_by_tagkeyvalue([tree.getroot()], 'flag', {'name':name})
XmlDao.saveAs(tree, self.__filename)
然後寫了一組案列,
import FlagDao
flagDao = FlagDao()
#查找節點
print flagDao.getValueByName('execute')
#修改節點
flagDao.setValueByName('execute', 'false')
#打印修改的節點
print flagDao.getValueByName('execute')
#添加節點
flagDao.addTag('zhangcan', 'bendan')
#刪除節點
flagDao.deleteTagByName('other')
運行之後,結果爲
<?xml version='1.0' encoding='utf-8'?>
<flags>
<flag name="execute" value="false" />
<flag name="zhangcan" value="bendan" /></flags>
希望我的過程能對您有點幫助。