在 Python 中,处理 XML 数据的常见方法是使用 xml.etree.ElementTree 模块,它是 Python 标准库的一部分。通过该模块,您可以轻松地解析、创建、修改和写入 XML 文件。此外,Python 还提供了其他库如 lxmlminidom,但 ElementTree 是最常用和轻量级的选择。

目录

  1. XML 解析基础
  2. 解析 XML 文件
  3. 遍历 XML 树
  4. 修改 XML 文件
  5. 生成 XML 文件
  6. 参考资料

1. XML 解析基础

XML(可扩展标记语言)是用于存储和传输数据的一种格式,广泛用于 Web 服务和数据交换中。XML 文档的结构通常包含标签、属性和文本内容,您可以通过解析 XML 文件获取和处理这些数据。

1.1 ElementTree 模块

xml.etree.ElementTree 是 Python 的标准库,提供了对 XML 文件的基本操作。通过 ElementTree,您可以:

  • 解析 XML 文件或字符串。
  • 获取和修改 XML 元素。
  • 遍历 XML 元素树。

2. 解析 XML 文件

2.1 解析 XML 文件(从文件读取)

import xml.etree.ElementTree as ET

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

# 打印根元素的标签和属性
print(f"根元素: {root.tag}, 属性: {root.attrib}")

2.2 解析 XML 字符串

import xml.etree.ElementTree as ET

# XML 字符串
xml_data = '''<?xml version="1.0"?>
<data>
    <item name="item1">This is item 1</item>
    <item name="item2">This is item 2</item>
</data>'''

# 解析 XML 字符串
root = ET.fromstring(xml_data)

# 打印根元素的标签和属性
print(f"根元素: {root.tag}, 属性: {root.attrib}")


3. 遍历 XML 树

在解析了 XML 文件之后,您可以使用树形结构的遍历方法访问 XML 中的各个元素。

3.1 获取所有子元素

import xml.etree.ElementTree as ET

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

# 获取所有直接子元素
for child in root:
    print(f"标签: {child.tag}, 属性: {child.attrib}, 内容: {child.text}")

3.2 获取特定标签的元素

import xml.etree.ElementTree as ET

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

# 获取所有名为 'item' 的元素
for item in root.findall('item'):
    name = item.get('name')
    print(f"Item 名称: {name}, 内容: {item.text}")

3.3 访问元素的属性和文本

import xml.etree.ElementTree as ET

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

# 获取特定元素的文本内容和属性
item = root.find('item')
print(f"Item 内容: {item.text}")
print(f"Item 属性: {item.attrib}")


4. 修改 XML 文件

在解析和读取 XML 文件后,您还可以修改 XML 元素的内容或属性。修改完成后,可以将修改后的树写回文件。

4.1 修改元素的文本和属性

import xml.etree.ElementTree as ET

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

# 修改元素内容
item = root.find('item')
item.text = '这是修改后的内容'

# 修改元素属性
item.set('name', 'modified_item')

# 保存修改后的 XML
tree.write('modified_example.xml')

4.2 删除元素

import xml.etree.ElementTree as ET

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

# 删除元素
item_to_delete = root.find('item')
root.remove(item_to_delete)

# 保存修改后的 XML
tree.write('modified_example.xml')


5. 生成 XML 文件

除了读取和修改现有的 XML 文件,您还可以使用 ElementTree 模块生成新的 XML 文件。

5.1 创建 XML 结构

import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("data")

# 创建子元素
item1 = ET.SubElement(root, "item", name="item1")
item1.text = "This is item 1"

item2 = ET.SubElement(root, "item", name="item2")
item2.text = "This is item 2"

# 创建树并写入文件
tree = ET.ElementTree(root)
tree.write("new_example.xml")

5.2 生成格式化的 XML 文件

ElementTree.write() 方法生成的 XML 文件没有缩进和换行。为了生成格式化(具有缩进)的 XML 文件,可以使用 minidom 模块来实现。

import xml.etree.ElementTree as ET
from xml.dom import minidom

# 创建 XML 结构
root = ET.Element("data")
item1 = ET.SubElement(root, "item", name="item1")
item1.text = "This is item 1"
item2 = ET.SubElement(root, "item", name="item2")
item2.text = "This is item 2"

# 获取 ElementTree 对象
tree = ET.ElementTree(root)

# 将 ElementTree 转换为字符串
xml_str = ET.tostring(root, 'utf-8')

# 使用 minidom 格式化
xml_str = minidom.parseString(xml_str).toprettyxml()

# 保存格式化后的 XML
with open("formatted_example.xml", "w") as f:
    f.write(xml_str)


6. 参考资料

出站链接

站内链接

通过这些方法,您可以在 Python 中高效地解析和生成 XML 数据,适用于各种数据处理和自动化任务。