XML模块
XML模块的功能和json模块的功能差不多,都是不同语言或程序之间得数据交换的协议。由于json比xml出现晚所以很多领域中xml已经无法被替代。其本质是利用标签语言的结构将数据封装。
相比于json,XML储存数据是利用文档树的方式,比较易读。
XML所用的标签语言又分为自闭和标签和非自闭和标签,自闭和标签只有在开头有tag,非自闭合标签在开头和结尾都有tag。
这是一个自闭和标签, 2</ rank>这是一个非自闭合标签。
一个XML树的例子
<data>#此处data就是一个根节点,所有的country都是data的子节点,country下的标签又是country的子节点
<country name = "Liechtenstein">#此处country就是标签名(tag),name是属性名,Liechtenstein是值
<rank updated = "yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name ="Austria" direction ="E"/>
<neighbor name ="Switzerland" direction = "W"/>
</country>
<country name ="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name ="Malaysia" direction="N"/>
</country>
</data>
以此XML树为例子展开在Python中对XML树的操作
获取根
import xml.etree.cElementTree as ET#import...as 是一种简写方式
tree = ET.parse("a.xml")#此处的a
root = tree.getroot()
print(root)#会打印一个内存地址,相当于一个对象
tag、attrib、text方法
import xml.etree.cElementTree as ET
tree = ET.parse("a.xml")
root = tree.getroot()
for i in root:
print(i.tag)#tag方法会得到标签内容
print(i.attrib)#attrib方法会得到属性名和属性值,以字典的形式显示
for i in root:
for j in i:
print(j.tag)
print(j.attrib)
for i in root:
for j in i :
print(j.text)#text方法会获得所有的数字值即两个属性名中间存的值,例 <year>2011</year>
.iter方法
.iter方法可以实现只遍历其中的某一个节点
tree = ET.parse("a.xml")
root = tree.getroot()
for node in root.iter("year"):#可以获得所有的year节点的内容
print(node.tag,node.attrib,node.text)
Python内XML树的增删改查
修改xml树
import xml.etree.cElementTree as ET
tree = ET.parse("a.xml")
root = tree.getroot()
for node in root.iter("year"):
new_year = int(node.text) + 1
node.text = str(new_year)#这两行实现每一个year标签的值加
node.set("updated", "yes")#为每一个year标签加入一个updated = "yes" 的属性
tree.write("a.xml")#将内存中的修改写入xml文件
删除xml树内容
import xml.etree.ElementTree as ET
tree = ET.parse("a.xml")
root = tree.getroot()
for country in root.findall("country"):
rank = int(country.find("rank").text)#.findall、.find方法均是用来找标签的方法,区别在于findall可以找多个
if rank > 3:
print(country.attrib)
root.remove(country)
tree.write("a.xml")
创建XML树
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")#创建根节点
name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})#创建根节点的子节点name,加入一个属性enrolled,值为yes,此处的new_xml代表对new_xml创建子节点,"name"代表子节点的tag
age = ET.SubElement(name, "age", attrib={"checked": "no"})#创建二级子节点
sex = ET.SubElement(age, "sex")
sex.text = "33"
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = "19"
et = ET.ElementTree(new_xml)
et.write("test.xml", encoding="utf-8", xml_declaration=True)
根据以上代码,生成的xml树为
-<namelist>
-<name enrolled="yes">
-<age checked="no">
<sex>33</sex>
</age>
</name>
-<name enrolled="no">
<age>19</age>
</name>
</namelist>