目录
Python读写xml文件
xml格式是什么
XML 指可扩展标记语言(eXtensible Markup Language)。
一个xml文件person.xml的格式如下。
<?xml version="1.0" encoding="utf-8" ?>
<myroot>
<aclass name="1">
<stu number="101">
<name>zhangsan</name>
<age>17</age>
</stu>
<stu number="102">
<name>wangwu</name>
<age>18</age>
</stu>
</aclass>
</myroot>
第一行是xml标志,必须有,固定写法,后面的字符编码可以不写,但是最好写全(可以避免乱码)。
接下来的内容都是自定义内容,主要包括如下元素:
- 标签(节点):myroot、aclass、stu等,它们是自定义标签,成对出现
- 属性:name="1",number="101",它们出现在标签<>之内
- 标签体内容:zhangsan,17,wangwu,18,它们出现在成对标签正中间
xml的特点:
-
标签名和标签体成对:
17 ,即age=17,成对出现 -
标签属性名和值成对,number="101",也是成对出现
- 标签数据分层次,
17 和18 标签名相同,但分别属于不同的学生,即不同。
像这样成对出现的信息我们在前面见过几次,其实Python的字典dict对象就是这样的。下面用字典dict来描述这样的信息。
# 定义一个dict对象
persondict={
"aclass":{
"name":"1",
"stu1111":{
"number":"101",
"name":"zhangsan",
"age":17
},
"stu2222": {
"number": "102",
"name": "wangwu",
"age": 18
}
}
}
print(persondict)
# {'aclass': {'name': '1', 'stu1111': {'number': '101', 'name': 'zhangsan', 'age': 17}, 'stu2222': {'number': '102', 'name': 'wangwu', 'age': 18}}}
信息描述很相似,但是有点区别就是dict中的key不能重复(否则被覆盖了),所以重复的
总之,xml是通过自定义标签方式来有层次的描述成对信息,即key,value。它是成对信息描述的另一种表现形式(dict和json都是成对信息的描述)。
Python解析xml主要方法
Python解析 XML的方法有三种,分别是,SAX,DOM,以及 ElementTree,这里只讲第三种方法。
更多内容可以参考标准库。
(https://docs.python.org/zh-cn/3/library/xml.dom.html)
(https://docs.python.org/zh-cn/3/library/xml.sax.html)
(https://docs.python.org/zh-cn/3/library/xml.etree.elementtree.html)
ElementTree解析xml主要有两个对象,xml树对象和xml元素:
- xml树对象:xml.etree.ElementTree
- xml元素:xml.etree.ElementTree.Element
ElementTree对象常用的方法有:
- parse():解析xml文件,返回此树对象
- getroot():得到根元素
- ElementTree():通过元素构造树对象
- write():将树对象写入文件
- SubElement():创建并返回子节点
Element元素对象常用的方法和属性有:
- findall():找到当前元素下符合条件的所有第一级子节点
- tag:元素节点名
- text:元素节点内容文本
- attrib:元素的属性字典
- Element():元素构造函数
- append():向此元素添加子元素
XPath是关于xml树层级表示的一种方式,根目录是".",可作为findall()中的参数。
ElementTree读取xml
ElementTree解析person.xml内容,示例如下。
import xml.etree.ElementTree as ET
tree=ET.parse("person.xml")
root=tree.getroot()
alist=root.findall("./aclass/stu")
print(alist[0].tag)
print(alist[0].attrib)
print(alist[0][0].tag)
print(alist[0][0].text)
print(alist[0][1].tag)
print(alist[0][1].text)
运行结果
C:UsershccmaAnaconda3python.exe E:/wkp01/p00/test01/atestpkg/t43.py
stu
{'number': '101'}
name
zhangsan
age
17
Process finished with exit code 0
ElementTree写入xml
ElementTree创建xml格式并写入person2.xml文件。
import xml.etree.ElementTree as ET
elem_root=ET.Element("myroot")
child=ET.Element("aclass")
elem_root.append(child)
stu=ET.SubElement(child,"stu")
stu.attrib={"number":"101"}
name=ET.SubElement(stu,"name")
name.text="zhangsan"
age=ET.SubElement(stu,"age")
age.text="17"
tree=ET.ElementTree(elem_root)
tree.write("person2.xml",encoding="utf-8")
运行结果,得到person2.xml文件。
<myroot><aclass><stu number="101"><name>zhangsan</name><age>17</age></stu></aclass></myroot>
格式化之后
<myroot>
<aclass>
<stu number="101">
<name>zhangsan</name>
<age>17</age>
</stu>
</aclass>
</myroot>