XML(eXtensible Markup Language,可扩展标记语言)是一种用于描述结构化数据的文本文件格式。

它以标签(tag)形式组织数据,具有自描述性和层级结构,适用于配置文件、数据交换、文档存储等场景。

几乎所有编程语言都支持 XML 的解析与生成,同时 XML 也兼容多种标准(如 XHTML、SVG、RSS 等)。

一、XML 格式特点

XML 文件的扩展名通常为 .xml。

XML 文件主要特点包括:

(1)标签结构

数据以 <tag> 和 </tag> 包围形成树状结构,可嵌套。

(2)自描述性

每个标签都可以说明其内容的含义。

(3)属性(Attribute)

标签可以包含属性,例如 <student id="1">Alice</student>。

(4)层级关系

支持父子节点、兄弟节点及嵌套节点,表示复杂结构。

(5)编码

推荐使用 UTF-8;在文件开头可声明 <?xml version="1.0" encoding="UTF-8"?>。

(6)注释

使用 <!-- 注释内容 -->。

示例 XML 文件:

<?xml version="1.0" encoding="UTF-8"?><students>    <student id="1">        <name>Alice</name>        <score>95</score>    </student>    <student id="2">        <name>Bob</name>        <score>88</score>    </student>    <student id="3">        <name>Carol</name>        <score>90</score>    </student></students>

以上示例展示了 XML 的基本结构:根节点 <students> 下包含多个 <student> 子节点,每个 <student> 节点又包含 <name> 与 <score>。

二、在 Python 中表示 XML 数据

(1)使用字符串与内存文件对象

当我们想在内存中操作 XML,而不立即写入磁盘时,可以使用 io.StringIO:

from io import StringIO
xml_text = """<?xml version="1.0" encoding="UTF-8"?><students>    <student id="1"><name>Alice</name><score>95</score></student>    <student id="2"><name>Bob</name><score>88</score></student></students>"""
# 创建内存中文本文件对象buf = StringIO(xml_text)print(buf.read())

StringIO 适用于测试、临时存储或从网络请求中解析小型 XML 内容。

(2)使用字典/列表在内存中表示 XML 树

在处理 XML 数据之前,通常先在内存中准备结构化数据。

示例:

students = [    {"id": 1, "name": "Alice", "score": 95},    {"id": 2, "name": "Bob", "score": 88},    {"id": 3, "name": "Carol", "score": 90},]print(students)

这种结构便于后续生成 XML,每个字典对应一个 <student> 节点。

三、使用 xml.etree.ElementTree 解析与生成 XML

Python 标准库 xml.etree.ElementTree(简称 ET)提供对 XML 的读写支持,能够处理树形结构、节点查找和属性管理。

(1)生成 XML 文件

import xml.etree.ElementTree as ET
# 根节点root = ET.Element("students")
# 添加子节点students = [    {"id": "1", "name": "Alice", "score": "95"},    {"id": "2", "name": "Bob", "score": "88"},    {"id": "3", "name": "Carol", "score": "90"},]
for s in students:    student = ET.SubElement(root, "student", id=s["id"])    name = ET.SubElement(student, "name")    name.text = s["name"]    score = ET.SubElement(student, "score")    score.text = s["score"]
# 写入文件tree = ET.ElementTree(root)tree.write("students.xml", encoding="utf-8", xml_declaration=True)print("students.xml 文件已保存。")

说明:

• ET.Element("tag") 创建节点。

• ET.SubElement(parent, "tag") 创建子节点并自动附加到父节点。

• tree.write() 可指定编码与是否写入 XML 声明。

(2)读取 XML 文件

import xml.etree.ElementTree as ET
tree = ET.parse("students.xml")root = tree.getroot()
for student in root.findall("student"):    sid = student.get("id")              # 获取属性    name = student.find("name").text     # 获取子节点文本    score = int(student.find("score").text)    print(sid, name, score)

输出结果:

1 Alice 952 Bob 883 Carol 90

说明:

• .find() 查找单个子节点,.findall() 查找所有匹配子节点。

• .get("attr") 获取节点属性值。

• 节点文本通过 .text 获取。

(3)修改与新增节点

import xml.etree.ElementTree as ETtree = ET.parse("students.xml")root = tree.getroot()
# 修改学生分数for student in root.findall("student"):    if student.get("id") == "2":        student.find("score").text = "90"
# 添加新学生new_student = ET.SubElement(root, "student", id="4")ET.SubElement(new_student, "name").text = "David"ET.SubElement(new_student, "score").text = "70"
tree.write("students_updated.xml", encoding="utf-8", xml_declaration=True)print("students_updated.xml 已更新。")

(4)防止 XML 注入(安全写入)

在处理来自外部的数据时,避免直接写入 XML 标签内容,建议使用 xml.sax.saxutils.escape 对特殊字符进行转义:

from xml.sax.saxutils import escape
name = '<Alice & Bob>'safe_name = escape(name)  # 转义为 &lt;Alice &amp; Bob&gt;

这样可防止 <、>、& 等字符破坏 XML 结构。

四、使用 Pandas 处理 XML 文件

从 Pandas 1.3 起,提供了 read_xml 与 to_xml 方法,可方便地将 XML 与 DataFrame 相互转换。

(1)读取 XML 文件

需安装必要的依赖:

pip install pandas lxml

示例:

import pandas as pd
df = pd.read_xml("students.xml")print(df)

输出:

id   name  score0   1  Alice     951   2    Bob     882   3  Carol     90

pandas 会自动解析节点标签,将属性或子节点转换为列。

(2)筛选与统计数据

# 筛选成绩 >= 90 的学生top_students = df[df["score"] >= 90]print(top_students)
# 平均分avg_score = df["score"].mean()print("平均分:", avg_score)

(3)将结果写回 XML 文件

top_students.to_xml("top_students.xml", index=False)print("高分学生 XML 已保存。")

五、综合案例

以下示例展示了 XML 文件在数据分析中的完整生命周期:数据创建 → 存储 → 读取 → 处理 → 输出。

import xml.etree.ElementTree as ETimport pandas as pd
# 1. 构造原始数据students = [    {"id": "1", "name": "Alice", "score": "95"},    {"id": "2", "name": "Bob", "score": "88"},    {"id": "3", "name": "Carol", "score": "90"},    {"id": "4", "name": "David", "score": "70"},]
# 2. 写入 XML 文件root = ET.Element("students")for s in students:    student = ET.SubElement(root, "student", id=s["id"])    ET.SubElement(student, "name").text = s["name"]    ET.SubElement(student, "score").text = s["score"]
tree = ET.ElementTree(root)tree.write("students.xml", encoding="utf-8", xml_declaration=True)
# 3. 使用 pandas 读取文件df = pd.read_xml("students.xml")
# 4. 筛选成绩 >= 85 的学生top = df[df["score"] >= 85]
# 5. 计算平均分avg_score = df["score"].mean()
print("高分学生:\n", top)print(f"平均分:{avg_score:.1f}")
# 6. 输出新的 XML 文件top.to_xml("top_students.xml", index=False)

运行结果:

高分学生:   id   name  score0   1  Alice     951   2    Bob     882   3  Carol     90平均分:91.0

📘 小结

XML 作为一种结构化数据格式,具有自描述性和层级结构特点,适用于多种数据场景。使用 Python 处理 XML 数据有两种主要方法:一是使用标准库 xml.etree.ElementTree 进行 XML 的解析、生成和修改,包括节点操作、属性管理和安全写入;二是利用 Pandas 库的 read_xml 和 to_xml 方法实现 XML 与 DataFrame 的高效转换,便于数据分析和处理。

图片

“点赞有美意,赞赏是鼓励”

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐