Python中的XML模块
XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据。在编程中,对XML的操作也非常常见。
XML格式
首先,来看一下XML所包含的元素类型
1、表情<tag>
2、属性<tag name='atrrib'>
3、数据<data>
例如一个XML文件
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
XML操作
-
读取
#从xml文件中读取,用getroot获取根节点,根节点也是Element对象 import xml.etree.ElementTree as Et tree=Et.parse('xml_file.xml')#解析 root=tree.getroot()
-
访问
访问Element对象的标签、属性和值
tag=root.tag#标签 atrrib=root.atrrib#属性 text=toot.text#值
访问子节点的标签、属性和值
for child in root: tag=child.tag#标签 atrrib=child.atrrib#属性 text=child.text#值
-
查找操作
Element元素迭代子元素:Element.iter("tag"),可以罗列该节点所包含的所有其他节点(element对象)
可以用任意一个根节点做对象
跨节点查找
返回迭代对象
#打印节点中所有的neighbor对象的name属性 for neighbor in root.iter('neighbor'): print(neighbor.attrib['name'])
Element.findall("tag"):查找当前元素为“tag”的直接子元素
返回的是一个list
#findall只能用来查找直接子元素,不能用来查找rank,neighbor等element for country in root.findall('country'): rank = country.find('rank').text name = country.find('rank').text neig = country.find('neighbor').attrib print(rank, name,neig)
Element.find("tag"):查找为tag的第一个直接子元素
不能跨节点查找
#返回第一个tag为country的element,如没有,返回None firstCountry = root.find("country") print(firstCountry)
创建xml文件
import xml.etree.ElementTree as Et #生成子节点 new_xml=Et.Element('namelist') #生成namelist下的子节点 name=Et.SubElement(new_xml,'name',attrib={'enrolled':'yes'}) #生成name下的子节点 age=Et.SubElement(name,'age',attrib={"checked":"no"}) sex=Et.SubElement(name,'sex') #生成sex的text sex.text='33' 添加第二个 name2=Et.SubElement(new_xml,'name',attrib={'enrolled':'yes'}) age2=Et.SubElement(name2,'age',attrib={"checked":"no"}) sex2=Et.SubElement(name2,'sex') sex2.text='23' #创建Element对象 et=Et.ElementTree(new_xml) #写入文件 et.write('test.xml',encoding='utf-8',xml_declaration=True)
修改xml文件
- ElementTree.write("xmlfile"):更新xml文件
- Element.append():为当前element对象添加子元素(element)
- Element.set(key,value):为当前element的key属性设置value值
- Element.remove(element):删除为element的节点
-
#读取待修改文件 updateTree = ET.parse("test.xml") root = updateTree.getroot() #创建新节点并添加为root的子节点 newEle = ET.Element("NewElement") newEle.attrib = {"name":"NewElement","age":"20"} newEle.text = "This is a new element" root.append(newEle) #修改year的Update属性 for node in root.iter('year'): node.set('Update','no') #写回原文件 updateTree.write("test.xml")

浙公网安备 33010602011771号