Python XML遍历子节点

简介

XML(可扩展标记语言)是一种用于存储和传输结构化数据的标记语言。在Python中,我们可以使用内置的xml.etree.ElementTree模块来解析和操作XML数据。通过遍历XML文档的子节点,我们可以提取和处理其中的数据。

本文将介绍如何使用Python解析XML文档,并使用示例代码演示如何遍历XML文档中的子节点。

XML的结构

XML文档由标签、属性和文本组成。标签用于标识数据的类型,属性用于提供额外的信息,而文本则是实际的数据。XML文档具有层次结构,标签可以嵌套在其他标签中,形成父子关系。我们可以通过遍历子节点来访问和处理XML中的数据。

下面是一个示例XML文档的结构:

<students>
    <student id="1">
        <name>John</name>
        <age>20</age>
        <gender>Male</gender>
    </student>
    <student id="2">
        <name>Jane</name>
        <age>21</age>
        <gender>Female</gender>
    </student>
    ...
</students>

在这个示例中,students是根节点,student是它的子节点。每个student节点都有一个id属性,以及nameagegender子节点。

使用Python解析XML文档

在Python中,我们可以使用xml.etree.ElementTree模块来解析XML文档。该模块提供了一个ElementTree类,可以表示整个XML文档,并提供了一组方法来操作XML数据。

首先,我们需要将XML文档加载到ElementTree对象中:

import xml.etree.ElementTree as ET

tree = ET.parse('students.xml')
root = tree.getroot()

在上面的代码中,我们使用parse函数将XML文件students.xml加载到一个ElementTree对象中,并使用getroot方法获取根节点。

遍历子节点

接下来,我们可以使用iter方法遍历根节点下的所有子节点:

for child in root:
    print(child.tag, child.attrib)

在上面的代码中,child是根节点的子节点,tag属性表示节点的标签,attrib属性表示节点的属性。

如果我们只对特定类型的子节点感兴趣,可以使用findalliterfind方法来筛选子节点:

for student in root.findall('student'):
    name = student.find('name').text
    age = student.find('age').text
    gender = student.find('gender').text
    print(name, age, gender)

在上面的代码中,findall方法返回与指定标签匹配的所有子节点,find方法返回第一个与指定标签匹配的子节点。我们可以使用text属性来访问子节点中的文本数据。

示例

让我们通过一个示例来演示如何遍历XML文档中的子节点。假设我们有一个XML文件students.xml,其中包含多个学生的信息。我们想要遍历所有学生的姓名和年龄,并计算平均年龄。

首先,我们需要创建一个Student类来表示学生信息:

```mermaid
classDiagram
    class Student {
        - name: str
        - age: int
        + __init__(name: str, age: int)
        + get_name(): str
        + get_age(): int
    }

然后,我们可以编写代码来解析XML文档并遍历子节点:

import xml.etree.ElementTree as ET

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

# 解析XML文档
tree = ET.parse('students.xml')
root = tree.getroot()

# 遍历子节点
students = []
for student in root.findall('student'):
    name = student.find('name').text
    age = int(student.find('age').text)
    students.append(Student(name, age))

# 计算平均年龄
total_age = sum([student.get_age() for