本节内容
1、简述
2、xml格式
3、xml节点操作
4、创建新的xml文件
一、简述
xml是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过,古时候,在json还没有诞生的黑暗年代,大家只能选择xml,到现在仍然有很多传统的公司,像金融行业的很多系统的接口还是xml。
二、xml格式
1、xml的格式
说明:就是通过<>节点来区别数据结构的,格式如下:
<?xml version="1.0"?> <data> <country 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> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data>
三、xml节点操作
1、查询xml文档内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import xml.etree.ElementTree as et tree = et.parse( "xmltest.xml" ) root = tree.getroot() #获取根节点 print (root.tag) #打印节点名称 #遍历xml文档 for child in root: print (child.tag,child.attrib) #分别打印子节点名称和子节点属性 #遍历子节点下的所有节点 for i in child: print (i.tag,i.text) #打印子节点下节点的节点名和节点值 #只遍历year节点 for i in child. iter ( "year" ): print ( " " ,i.tag,i.attrib,i.text) #只遍历year节点 for node in root. iter ( "year" ): print (node.tag,node.text) #打印year的节点名和节点值 |
注:
- tag是返回节点名,attrib返回节点属性,text返回节点值
- 返回根节点用getroot()方法
- 只遍历某个节点,只需要用iter(节点名)方法
2、修改xml文档内容
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import xml.etree.ElementTree as et tree = et.parse( "xmltest.xml" ) root = tree.getroot() #修改year节点的值 for node in root. iter ( "year" ): new_year = int (node.text) + 1 #修改节点值 node.text = str (new_year) #修改后强制转换成字符串类型 node.tag = "myyear" #修改节点名 node. set ( "zhangqigao" , 'handsome' ) #修改节点属性 tree.write( "xmltest1.xml" ) #修改完成后,重新写入xml文件(可以是任何文件,包括原来的) |
注:可以修改xml文件中的任何内容,包括本身的节点名,修改后一定要有写入xml文件的操作。
3、删除node节点
1
2
3
4
5
6
7
8
9
10
11
12
|
import xml.etree.ElementTree as et tree = et.parse( "xmltest.xml" ) root = tree.getroot() #删除 for country in root.findall( "country" ): #找到第一层子节点 rank = int (country.find( "rank" ).text) #找到子节点下的'rank'节点的节点值 if rank > 50 : root.remove(country) #删除子节点 tree.write( "xmltest1.xml" ) #重新写入xml文件 |
注:
- findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址
- find从根节点查找第一层子节点名,返回第一层子节点下的所有节点的内存地址
- 删除子节点用remove()方法
- 删除以后,一定要做重新写入新的xml文件操作
四、创建新的xml文件
1、手动创建xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import xml.etree.ElementTree as et new_xml = et.Element( "namelist" ) #创建根节点 #创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性 name = et.SubElement(new_xml, "name" ,attrib = { "zhangqigao" : "handsome" }) #创建第二层子节点 age = et.SubElement(name, "age" ,attrib = { "check" : "yes" }) #设置第二层节点值 age.text = '22' sex = et.SubElement(name, "sex" ) sex.text = "man" #创建另外一个第一层子节点 name2 = et.SubElement(new_xml, "name" ,attrib = { "zhangqigao" : "haoshuai" }) #创建其第二层子节点 age = et.SubElement(name2, "age" ) age.text = '19' ET = et.ElementTree(new_xml) #生成新的xml文档 ET.write( "test.xml" ,encoding = "utf-8" ,xml_declaration = True ) #在新xml文件的开头自动添加:<?xml version='1.0' encoding='utf-8'?> et.dump(new_xml) #在屏幕上打印生成的格式 |
注:et.dump(new_xml)这个有什么作用呢?当你需要直接把字符串传过去,不需要串文件时,用这个就ok了。