#usr/bin/python #-*-coding:utf-8-*- """ python 对 xml 文件的处理 方式一:dom 将文件在内存中解析成一个树来操作 优点:可以任意遍历树的节点 缺点:占用内存大,解析速度慢 方式二:xml.etree.ElementTree 类似一个轻量级的dom 方式三:xml.sax """ import xml.etree.ElementTree as ET tree = ET.parse("01.xml") # ET.parse("文件路径") 加载想要读取的文件 ,赋予 tree root = tree.getroot() # tree.getroot() 获取根节点 """ 获取根节点然后赋予 root 此时 root 具有三个属性: 1,root.tag 是节点的标签名 2,root.attrib 是节点的属性 格式为,属性=“属性值”,可以有多个属性,以空格分隔 3,root.text 是节点的文本内容 """ print('root_tag:{}'.format(root.tag)) # .tag 节点标签名称 print("root_attrib:{}".format(root.attrib)) # .attrib 节点标签的属性,输出为字典 print("root_text:{}".format(root.text)) # .text 节点标签的内容 node1 = root.find("country") # find()父级查找直接子级节点 ,只能获取子级的第一个 country 节点 print(node1.tag,node1.attrib,node1.text) node11 = node1.find("rank") print(node11.tag,node11.attrib,node11.text) node2 = root.findall("country") # findall() 父级查找直接子级的所有 country 节点,输出为列表 print(node2) for i in node2: print("tag:{} | attrib:{} | text:{}".format(i.tag,i.attrib,i.text)) for sub_root in root: print("sub_root_tag:{},sub_root_attrib:{},sub_root_text:{}".format(sub_root.tag,sub_root.attrib,sub_root.text)) for node in node2: if node.attrib["name"] == "日本": # 找到属性名为日本的节点 root.remove(node) # 调用该节点的父节点来删除 break tree.write("02.xml",encoding="utf-8") # 执行完毕写入到文件 02.xml """ 字典格式输出 1,以一级节点属性名 name 的值为 key ,以二级节点为 value 2,value 为列表格式 3,value 列表中,嵌套字典,该字典以二级节点标签名为 key ,以二级节点 text 为 value """ dict1 = {} value = [] for i in root: # 遍历根节点的子节点 (获取一级节点) # print("tag:{},attrib:{},text:{}".format(i.tag,i.attrib,i.text)) for j in i: # 遍历一级节点的子节点(获取二级节点) # print("\t\ttag:{},attrib:{},text:{}".format(j.tag,j.attrib,j.text)) # text 没有的输出 None # print() # for k in j: # 三级 # print("\t\t\t\ttag:{},attrib:{},text:{}".format(k.tag,k.attrib,k.text)) if j.text is None: value.append(j.attrib) else: value.append({j.tag:j.text}) dict1[i.attrib["name"]] = value print(dict1) """ python 对 xml 文件的处理 方式一:dom 将文件在内存中解析成一个树来操作 优点:可以任意遍历树的节点 缺点:占用内存大,解析速度慢 方式二:xml.etree.ElementTree 类似一个轻量级的dom 方式三:xml.sax """ import xml.sax class MovieHandler(xml.sax.ContentHandler): # 定义类,并继承 xml.sax.ContenHandler def __init__(self): self.CurrentData = "" # 当前数据 self.type = "" self.format = "" self.year = "" self.rating = "" self.stars = "" self.description = "" def startElement(self, tag, attrs): self.CurrentData = tag if tag == "movie": print("-----------------------movie--------------------") title = attrs["title"] print("title:{}".format(title)) def characters(self, content): if self.CurrentData == "type": self.type = content elif self.CurrentData == "format": self.format = content elif self.CurrentData == "year": self.year = content elif self.CurrentData == "rating": self.rating = content elif self.CurrentData == "stars": self.stars = content elif self.CurrentData == "description": self.description = content def endElement(self, name): if self.CurrentData == "type": print("type:{}".format(self.type)) elif self.CurrentData == "format": print("format:{}".format(self.format)) elif self.CurrentData == "year": print('year:{}'.format(self.year)) elif self.CurrentData == "rating": print('rating:{}'.format(self.rating)) elif self.CurrentData == "stars": print('stars:{}'.format(self.stars)) elif self.CurrentData == "description": print("description:{}".format(self.description)) self.CurrentData = "" if __name__ == "__main__": p1 = xml.sax.make_parser() # 创建 sax 阅读器 p1 h1 = MovieHandler() # 实例化 MovierHandler 为h1 p1.setContentHandler(h1) # 阅读器 p1 调用 setContentHandler() 执行 h1 p1.parse("001.xml") # p1 调用parse() 读取 001.xml
python 对 xml 文件的处理
最新推荐文章于 2025-06-25 19:09:24 发布