python xml 增删改查 – 综合案例

# xml 增删改查 – 综合案例
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element
from xml.dom import minidom


class XmlManual:
    def __init__(self, filename):
        self.filename = filename
        self.tree = ET.parse(self.filename)
        self.root = self.tree.getroot()

    # 读取xml文件中的内容
    def readXml(self):
        xml = open(self.filename, 'r', encoding='utf-8').read()
        print('------------------------------------------------------')
        print(xml, end='')
        print('------------------------------------------------------', '\n')

    # 遍历xml中所有节点,并存入列表中
    def walkData(self, root_node, level, result_list):
        global unique_id    # 全局唯一标识,用来表示序号,在类外面添加 unique_id = 1
        temp_list = [unique_id, level, root_node.tag]  # 将节点序号,层级,标签名 存入 临时列表
        result_list.append(temp_list)  # 将已保存数据的 临时列表 存入 结果列表中
        unique_id += 1  # 序号递增
        # 遍历每个子节点
        children_node = root_node.getchildren()  # 获取 节点的子节点
        if len(children_node) == 0:  # 判断是否存在子节点,没有直接返回,有则 递归 子节点
            return
        for child in children_node:
            self.walkData(child, level + 1, result_list)
        return

    def getXmlData(self):
        level = 1  # 节点的深度从1开始
        self.result_list = []  # 用于存放节点信息
        self.walkData(self.root, level, self.result_list)
        return self.result_list

    # 获取节点内所有 没有子节点的节点, 该方法目的是为了解决 获取参数节点内的参数,会碰到表单 嵌套的情况
    def walkNode(self, childNodes):  # children: 目标节点的子节点
        global data
        if len(childNodes) == 0:  # 判断是否存在子节点,没有直接返回空
            return
        for child in childNodes:
            if child.getchildren() == []:  # 判断子节点是否存在子节点,没有就获取该节点,有则递归 该子节点
                data.append(child.tag)
                child.text = '{{' + child.tag + '}}'
            else:
                self.walkNode(child.getchildren())

    def modifySingleNode(self, nodePath='root'):
        if nodePath == 'root':
            children = self.root.getchildren()
        else:
            children = self.tree.find(nodePath).getchildren()
        self.walkNode(children)

    # 修改节点文本内容
    def modifyNodeText(self, text, nodePath='root'):
        if nodePath == 'root':
            self.root.text = text
            return
        self.tree.find(nodePath).text = text

    # 在指定位置 插入子节点
    def addElement(self, addIndex, tag, attribDict, nodePath='root', text=None):
        child_node = Element(tag, attribDict)
        child_node.text = text
        if nodePath == 'root':
            self.root.insert(addIndex, child_node)
            return
        self.tree.find(nodePath).insert(addIndex, child_node)

    # 修改节点属性
    def modifyXmlAttrib(self, attribList, nodePath='root', isDelete=False):
        if nodePath == 'root':
            node = self.root
        else:
            node = self.tree.find(nodePath)
        for attrib in attribList:
            # attrib.keys():获取要所改属性的键,返回的是dict_key['']类型,故将其 转为 列表类型便于取出key值
            attribKey = list(attrib.keys())[0]
            attribValue = attrib[attribKey]
            print(attribKey, attribValue)
            if isDelete == True:
                del node.attrib[attribKey]
                return
            node.set(attribKey, attribValue)

    # 常规保存xml文件
    def saveXml(self, outputFile):
        self.tree.write(outputFile, encoding="utf-8", short_empty_elements=False)  # 为了不简写空标签

    # 格式化保存xml文件
    def formatSaveXML(self, outputFile):  # root:xml文件根节点,fileName:要保存文件的路径名
        self.tree.write(outputFile, xml_declaration=True, encoding="utf-8", short_empty_elements=False)


if __name__ == "__main__":
    xml = XmlManual('D:\\study_sources\\DSA12_yewuhsaihd.xml')
    unique_id = 1
    print(xml.getXmlData())
    data = ['name']
    xml.modifySingleNode('step/request')
    data.append('back')
    print(data)
    xml.modifyNodeText('good', 'caseinfo')
    xml.addElement(0, 'xiaokang', {'giao': 'diao'}, 'root')
    xml.modifyXmlAttrib([{'爽': 'happy'}, {'淦': 'niupi'}], 'step')
    outputFile = 'D:\\study_sources\\DSA12_yewuhsaihd_gai.xml'
    xml.noSimpleFormatSave(outputFile)
    xml = XmlManual(outputFile)
    xml.readXml()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值