专栏首页python3Python+Xml +操作+增删改查

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>

希望我的过程能对您有点帮助。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python之高阶函数和匿名函数

    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    py3study
  • python装饰器1:函数装饰器详解

    假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式:

    py3study
  • python socket学习

    [root@localhost example]# python echoclient1.py

    py3study
  • 二叉查找树二叉查找树

    二叉查找树 二叉查找树是一种特殊的二叉树,该数据结构的核心性质是: 对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值...

    月见樽
  • “你感受过被监控的恐惧吗?”

    ? ? 这就是Prometheus ? 随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus作为生态圈 Clo...

    腾讯云TStack
  • promethus与监控系统

    随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus 作为生态圈 Cloud Native Computing ...

    机智的程序员小熊
  • javascript 红皮高程(8)

    今天继续,JS的数值转换。这里面的坑啊, 真是太多了。 JS有三个函数可以把非数值转为数值: Number(); parseInt(); parseFloat(...

    web前端教室
  • Github 项目推荐 | TensorFlow 项目模板架构最佳实践

    一个简单且设计良好的架构对于任何深度学习项目来讲非常有必要,这里的 Tensorflow 项目模板经过了大量的实践,拥有简单性、良好的文件结构以及 OOP 设计...

    AI研习社
  • 被称为低价屠夫的 Virmach,实际体验如何?

    Virmach 是一家比较久以前就听过的 虚拟主机 / VPS / 独服 厂商,因为比较低廉的价格被众多大佬称为低价屠夫。这次在黑色星期五以及网络星期一活动里面...

    惶心
  • Link Cut Tree入门

    LCT 是 link cut tree 的简称,顾名思义~ 就是树带动态的增删边的操作.

    ACM算法日常

扫码关注云+社区

领取腾讯云代金券