当你须要解析和处理 XML 的时候,Python 表现出了它 “batteries included” 的一面。 标准库 中大量可用的模块和工具足以应对 Python 或者是 XML 的新手。node
ElementTree 生来就是为了处理 XML ,它在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree ,另一种是速度快一点的 xml.etree.cElementTree 。python
从 Python 3.3 开始,ElementTree 模块会自动寻找可用的 C 库来加快速度。因此只须要 importxml.etree.ElementTreeapp
XML 是一种分级的数据形式,因此最天然的表示方法是将它表示为一棵树。ET 有两个对象来实现这个目的 - ElementTree 将整个 XML 解析为一棵树, Element 将单个结点解析为树。若是是整个文档级别的操做(好比说读,写,找到一些有趣的元素)一般用 ElementTree 。单个 XML 元素和它的子元素一般用 Element 。dom
eg:ide
xm.xml
工具
<data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2023</year> <gdppc>141100</gdppc> <neighbor direction="E" name="Austria" /> <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore"></country> </data>
加载而且解析这个 XML :xml
from xml.etree import ElementTree as et tree = et.parse('xm') root = tree.getroot() #获取xml文件的根节点 print(root) print(root.tag) <Element 'data' at 0x00A28750> data
# 遍历XML文档的第二层 for child in root: # 第二层节点的标签名称和标签属性 print(child.tag, child.attrib) # 遍历XML文档的第三层 for i in child: # 第二层节点的标签名称和内容 print(i.tag,i.text)
咱们能够用一个简单的递归获取 XML 中的任何元素。然而,由于这个操做比较广泛,ET 提供了一些有用的工具来简化操做对象
遍历全部的元素,而后检验有没有你想要的。ET 可让这个过程更便捷。 iter 方法接受一个标签名字,而后只遍历那些有指定标签的元素:递归
from xml.etree import ElementTree as ET ############ 解析方式一 ############ """ # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').read() # 将字符串解析成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('xm.xml', 'r').read() # 将字符串解析成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')
删除节点
# 顶层标签 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) ############ 保存文件 ############ 仍是前面那两种方式
建立XML文档
from xml.etree import ElementTree as ET # 建立根节点 root = ET.Element("famliy") # 建立节点大儿子 son1 = ET.Element('son', {'name': '儿1'}) # 建立小儿子 son2 = ET.Element('son', {"name": '儿2'}) # 在大儿子中建立两个孙子 grandson1 = ET.Element('grandson', {'name': '儿11'}) grandson2 = ET.Element('grandson', {'name': '儿12'}) son1.append(grandson1) son1.append(grandson2) # 把儿子添加到根节点中 root.append(son1) root.append(son1) tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
建立方式二:
from xml.etree import ElementTree as ET # 建立根节点 root = ET.Element("famliy") # 建立大儿子 son1 = root.makeelement('son', {'name': '儿1'}) # 建立小儿子 son2 = root.makeelement('son', {"name": '儿2'}) # 在大儿子中建立两个孙子 grandson1 = son1.makeelement('grandson', {'name': '儿11'}) grandson2 = son1.makeelement('grandson', {'name': '儿12'}) son1.append(grandson1) son1.append(grandson2) # 把儿子添加到根节点中 root.append(son1) root.append(son1) tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
方式三:
from xml.etree import ElementTree as ET # 建立根节点 root = ET.Element("famliy") # 建立节点大儿子 son1 = ET.SubElement(root, "son", attrib={'name': '儿1'}) # 建立小儿子 son2 = ET.SubElement(root, "son", attrib={"name": "儿2"}) # 在大儿子中建立一个孙子 grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'}) grandson1.text = '孙子' et = ET.ElementTree(root) #生成文档对象 et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
因为原生保存的XML时默认无缩进,若是想要设置缩进的话, 须要修改保存方式:
from xml.etree import ElementTree as ET 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") 按上面方式建立文档内容 raw_str = prettify(root) f = open("xxxoo.xml",'w',encoding='utf-8') f.write(raw_str) f.close()