Python+Xml +操作+增刪改查

由於小編的系統需要進程間通信,想通過對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>

希望我的過程能對您有點幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章