python xml模块学习
xml打开方式
# xml有两种打开方式 # 1. 打开文件,读取XML内容 str_xml = open('xman.xml', 'r').read() print(str_xml) # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) # 读取字符串,将字符串转为Element对象 print(root) # 2. 直接解析xml文件 tree = ET.parse("xman.xml") # 直接从xml文件解析封装一个ElementTree对象 print(tree) # 以上一个是读取字符串,转换为Element对象,另一个是转换为ElementTree对象,这两个对象具体不同,请参考操作xml部分
获取XML标签
# 例如我现在有一个xml文件 <data test="xxx"> <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"> <rank updated="yes">5</rank> <year>2026</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2026</year> <gdppc>13600</gdppc> <neighbor direction="W" name="Costa Rica" /> <neighbor direction="E" name="Colombia" /> </country> </data>
# 获取xml文件的根节点 root1 = tree.getroot() # 获取根节点,同样这里root1为Element对象 print(root1) # 获取标签名 s = root.tag print(s) ==> data # 仅仅只会获取最顶层的标签名 # 所以,我们可以迭代获取子标签名 # 这里清楚概念,root是一个Element对象,它迭代的每一个都是Element对象 # 是可以使用同样的tag等方法的 for i in root: # 可迭代的方式获取子标签名 print(i.tag) # 获取下一级的标签名 ==> country country country # 获取标签属性 s = root.attrib # 获取标签属性 print(s) ==> {'test': 'xxx'} for i in root: # 可迭代的方式获取子标签名 print(i.attrib) # 获取下一级的标签属性 ==> {'name': 'Liechtenstein'} {'name': 'Singapore'} {'name': 'Panama'} # 获取标签内容 s = root.text # 获取标签内容 print(s) ==> # 空,一级标签下包含的其它标签不算是内容 for i in root: # 可迭代的方式获取子标签名 for j in i: print(j.text) # 获取下一级的标签内容
操作XML并写入文件
# 开头我们说了,有两种打开方式打开xml这里我们就分别用两种方式,再次演示,具体Element与ElementTree对象不同 ############ 解析方式一 ############ # 读取字符串 # 打开文件,读取XML内容 str_xml = open('xman.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) # 读入字符串 ############ 操作 ############ # 顶级标签 print(root.tag) # 循环所有的year节点 # iter方法:在当前节点的子孙中,根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环) for node in root.iter('year'): # 将year节点中的内容自增1 new_year = int(node.text) + 1 node.text = str(new_year) # 设置属性(没有添加,有修改) node.set('name', 'alex') node.set('age', '18') # 删除属性 del node.attrib['name'] # 删除name属性 ############ 保存文件 ############ tree = ET.ElementTree(root) tree.write("xml_t2.xml", encoding='utf-8')
############ 解析方式二 ############ # 直接解析xml文件 tree = ET.parse("xman.xml") # 获取xml文件的根节点 root = tree.getroot() # 这里会生成一个ElementTree对象 ############ 操作 ############ # 顶层标签 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("xml_t2.xml", encoding='utf-8')
创建XML文件
# 创建xml文档 # 创建根节点 root = ET.Element('famliy') # 创建节点大儿子 # son1 = ET.Element('son', {'name':'儿1'}) # son1 = root.makeelement('son', {'name': '儿1'}) # 方法二 # son1 = ET.SubElement(root, "son", attrib={'name': '儿1'}) # 方法三 # 创建节点小儿子 # son2 = ET.Element('son', {'name':'儿2'}) # son2 = root.makeelement('son', {"name": '儿2'}) # 方法二 # son2 = ET.SubElement(root, "son", attrib={"name": "儿2"}) # 方法三 # 在大儿子中创建两个孙子 # grandson1 = ET.Element('grandson', {'name': '儿11'}) # grandson1 = son1.makeelement('grandson', {'name': '儿11'}) # 方法二 grandson2 = ET.Element('grandson', {'name': '儿12'}) # grandson2 = son1.makeelement('grandson', {'name': '儿12'}) # 方法二 # 方法三 # grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'}) # grandson1.text = '孙子' # 可以操作标签内容 # 将以上穿件孙子添加到儿子 son1.append(grandson1) son2.append(grandson2) # 把儿子添加到根节点中 root.append(son1) root.append(son2) # 生成写入一个xml tree = ET.ElementTree(root) tree.write('xml_t3.xml',encoding='utf-8',xml_declaration=True ,short_empty_elements=False) # xml_declaration 设置为<?xml version='1.0' encoding='utf-8'?> xml注释 # short_empty_elements 自闭和的一个参数,如果便签没有text,则 自闭和 没有</xxx>