Python基础教程

013_Python读写xml文件

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",也是成对出现

  • 标签数据分层次,1718标签名相同,但分别属于不同的学生,即不同。

像这样成对出现的信息我们在前面见过几次,其实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不能重复(否则被覆盖了),所以重复的标签使用了两个不同的名称“stu1111”和"stu2222"。

总之,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>
这篇文章对您有用吗?

我们要如何帮助您?