XML模块

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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值