#!/usr/bin/env python # -*- coding: utf-8 -*- ''' XML是不同语言或程序之间进行数据交换的协议 ''' ''' #利用ElementTree.XML将字符串解析成xml对象 from xml.etree import ElementTree as ET # 打开文件,读取XML内容 str_xml = open('test.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) #利用ElementTree.parse将文件直接解析成xml对象 from xml.etree import ElementTree as ET # 直接解析xml文件 tree = ET.parse("test.xml") # 获取xml文件的根节点 root = tree.getroot() print(root) print(root.tag) #获取根节点的标签名 print(root.attrib) #获取根节点的属性 #makeelement(self, tag, attrib) 创建一个新节点 #append(self, subelement) 当前节点追加一个子节点 extend(self, elements) 为当前节点扩展 n 个子节点 insert(self, index, subelement) 在当前节点的子节点中插入某个节点,即:为当前节点创建子节点,然后插入指定位置 remove(self, subelement) 在当前节点在子节点中删除某个节点 find(self, path, namespaces=None) 获取第一个寻找到的子节点 findtext(self, path, default=None, namespaces=None) 获取第一个寻找到的子节点的内容 findall(self, path, namespaces=None) 获取所有的子节点 iterfind(self, path, namespaces=None) 获取所有指定的节点,并创建一个迭代器(可以被for循环) clear(self) 清空节点 get(self, key, default=None) 取当前节点的属性值 set(self, key, value) 为当前节点设置属性值 keys(self) 获取当前节点的所有属性的 key items(self) 获取当前节点的所有属性值,每个属性都是一个键值对 iter(self, tag=None) 在当前节点的子孙中根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)。 itertext(self) 在当前节点的子孙中根据节点名称寻找所有指定的节点的内容,并返回一个迭代器(可以被for循环)。 ''' ''' 遍历XML文档的所有内容 利用ElementTree.parse将文件直接解析成xml对象 from xml.etree import ElementTree as ET # 直接解析xml文件 tree = ET.parse("test.xml") # 获取xml文件的根节点 root = tree.getroot() print(root.tag) #顶层标签 #遍历XML文档的第二层 for child in root: print(child.tag,child.attrib) #第二层节点的标签名和属性 #遍历XML文档的第三层 for i in child: print(i.tag,i.attrib,i.text) #第三层文档的标签名和属性、标签之间的文本内容 ''' ''' 遍历XML中指定节点 from xml.etree import ElementTree as ET ############ 解析方式一 ############ """ # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').ReadMe.md() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) """ ############ 解析方式二 ############ # 直接解析xml文件 tree = ET.parse("xo.xml") # 获取xml文件的根节点 root = tree.getroot() ### 操作 # 顶层标签 print(root.tag) # 遍历XML中所有的year节点 for node in root.iter('year'): # 节点的标签名称和内容 print(node.tag, node.text) ''' ''' 修改节点内容 #解析字符串方式,修改,保存 from xml.etree import ElementTree as ET ############ 解析方式一 ############ # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').ReadMe.md() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签 print(root.tag) # 循环所有的year节点 for node in root.iter('year'): # 将year节点中的内容自增一 new_year = int(node.text) + 1 node.text = str(new_year) # 设置属性 node.set('name', 'alex') node.set('age', '18') # 删除属性 del node.attrib['name'] ############ 保存文件 ############ tree = ET.ElementTree(root) tree.write("newnew.xml", encoding='utf-8') #解析文件方式,修改,保存 from xml.etree import ElementTree as ET ############ 解析方式二 ############ # 直接解析xml文件 tree = ET.parse("xo.xml") # 获取xml文件的根节点 root = tree.getroot() ############ 操作 ############ # 顶层标签 print(root.tag) # 循环所有的year节点 for node in root.iter('year'): # 将year节点中的内容自增一 new_year = int(node.text) + 1 node.text = str(new_year) # 设置属性 node.set('name', 'alex') node.set('age', '18') # 删除属性 del node.attrib['name'] ############ 保存文件 ############ tree.write("newnew.xml", encoding='utf-8') ''' ''' 删除节点 #解析字符串方式打开,删除,保存 from xml.etree import ElementTree as ET ############ 解析字符串方式打开 ############ # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').ReadMe.md() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) ############ 操作 ############ # 顶层标签 print(root.tag) # 遍历data下的所有country节点 for country in root.findall('country'): # 获取每一个country节点下rank节点的内容 rank = int(country.find('rank').text) if rank > 50: # 删除指定country节点 root.remove(country) ############ 保存文件 ############ tree = ET.ElementTree(root) tree.write("newnew.xml", encoding='utf-8') #解析文件方式打开,删除,保存 from xml.etree import ElementTree as ET ############ 解析文件方式 ############ # 直接解析xml文件 tree = ET.parse("xo.xml") # 获取xml文件的根节点 root = tree.getroot() ############ 操作 ############ # 顶层标签 print(root.tag) # 遍历data下的所有country节点 for country in root.findall('country'): # 获取每一个country节点下rank节点的内容 rank = int(country.find('rank').text) if rank > 50: # 删除指定country节点 root.remove(country) ############ 保存文件 ############ tree.write("newnew.xml", encoding='utf-8') ''' ''' 添加节点、节点内容 from xml.etree import ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() ele = ET.Element('aelx',{'k1':'v1'}) #创建一个节点,并指定其节点名和属性 ele.text = '添加内容' #为节点设置内容 root.append(ele) #把ele节点添加到根节点中 tree.write('xx.xml',encoding='utf-8') ''' ''' 创建XML ''' from xml.etree import ElementTree as ET root = ET.Element('family') #创建一个根节点 #创建二级节点 son = ET.Element('son',{'name':'the sons'}) #其他两种节点创建方式 #son = root.makeelement('son',{'name':'the sons'}) #直接在根节点root中创建新节点son #son = ET.SubElement(root,'son',{'name':'the sons'}) #先创建son节点,然后添加到root节点中 son.text = 'son' girl = ET.Element('girl',{'name':'the girls'}) girl.text = 'girl' #创建三级节点 grandson = ET.Element('grandson',{'name':'the grandsons'}) grandson.text = 'grandson' grandgirl = ET.Element('grandgirl',{'name':'the grandgirls'}) grandgirl.text = 'grandgirl' #将三级节点添加到二级节点中 son.append(grandson) girl.append(grandgirl) #将二级节点添加到根节点中 root.append(son) root.append(girl) #保存到XML文件(没有则新建) # tree = ET.ElementTree(root) # tree.write('new.xml',encoding='utf-8',short_empty_elements=False,xml_declaration=True) #由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式 from xml.dom import minidom #自定义方法:将节点转换成字符串,并添加缩进 def prettify(elem): """将节点转换成字符串,并添加缩进。 """ rough_string = ET.tostring(elem, 'utf-8') #将节点转换成字符串 reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") #将原生root进行缩进,然后再进行保存 with open('new.xml','w',encoding='utf-8') as f: new_root_str = prettify(root) f.write(new_root_str)
关注我的公众号,不定期推送资讯
本文来自博客园,作者:链条君,转载请注明原文链接:https://www.cnblogs.com/MacoLee/articles/6030044.html