# 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()
python xml 增删改查 – 综合案例
最新推荐文章于 2022-11-09 16:44:52 发布