在 Python 中,处理 XML 数据的常见方法是使用 xml.etree.ElementTree
模块,它是 Python 标准库的一部分。通过该模块,您可以轻松地解析、创建、修改和写入 XML 文件。此外,Python 还提供了其他库如 lxml
和 minidom
,但 ElementTree
是最常用和轻量级的选择。
目录
1. XML 解析基础
XML(可扩展标记语言)是用于存储和传输数据的一种格式,广泛用于 Web 服务和数据交换中。XML 文档的结构通常包含标签、属性和文本内容,您可以通过解析 XML 文件获取和处理这些数据。
1.1 ElementTree 模块
xml.etree.ElementTree
是 Python 的标准库,提供了对 XML 文件的基本操作。通过 ElementTree
,您可以:
- 解析 XML 文件或字符串。
- 获取和修改 XML 元素。
- 遍历 XML 元素树。
2. 解析 XML 文件
2.1 解析 XML 文件(从文件读取)
1 2 3 4 5 6 7 8 | import xml.etree.ElementTree as ET # 解析 XML 文件 tree = ET.parse('example.xml') root = tree.getroot() # 打印根元素的标签和属性 print(f"根元素: {root.tag}, 属性: {root.attrib}") |
2.2 解析 XML 字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 获取所有子元素
1 2 3 4 5 6 7 8 9 | 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 获取特定标签的元素
1 2 3 4 5 6 7 8 9 10 | 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 访问元素的属性和文本
1 2 3 4 5 6 7 8 9 10 | 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 修改元素的文本和属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 删除元素
1 2 3 4 5 6 7 8 9 10 11 12 | 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 结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
模块来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 数据,适用于各种数据处理和自动化任务。
发表回复