Python ElementTree
最后修改:2025 年 2 月 15 日
在本文中,我们将展示如何在 Python 中使用 ElementTree 模块进行 XML 解析和创建。ElementTree 模块提供了简单而高效的 API 来处理 XML 数据。它是 Python 标准库的一部分,被广泛用于 XML 处理。
ElementTree 模块在读取、写入和修改 XML 文件等任务中特别有用。
主要特点
- 一个轻量级且用户友好的 API,用于解析和操作 XML 数据。
- 将 XML 文档表示为树形结构,其中元素是节点。
- 非常适合处理小型到中型 XML 文件。
使用 ElementTree 解析 XML
以下示例演示了如何使用 ElementTree 解析 XML 文档。
import xml.etree.ElementTree as ET
# XML data
xml_data = """
<products>
<product>
<id>1</id>
<name>Product 1</name>
<price>10.99</price>
<quantity>30</quantity>
</product>
<product>
<id>2</id>
<name>Product 2</name>
<price>20.99</price>
<quantity>130</quantity>
</product>
<product>
<id>3</id>
<name>Product 3</name>
<price>24.59</price>
<quantity>350</quantity>
</product>
<product>
<id>4</id>
<name>Product 4</name>
<price>9.9</price>
<quantity>650</quantity>
</product>
<product>
<id>5</id>
<name>Product 5</name>
<price>45</price>
<quantity>290</quantity>
</product>
</products>
"""
# Parse the XML data
root = ET.fromstring(xml_data)
# Iterate over product elements
for product in root.findall('product'):
id = product.find('id').text
name = product.find('name').text
price = product.find('price').text
quantity = product.find('quantity').text
print(f"Id: {id}, Name: {name}, Price: {price}, Quantity: {quantity}")
在此程序中,使用 ET.fromstring 函数来解析 XML 数据。使用 findall 方法查找所有 product 元素,并使用 find 方法提取 id、name、price 和 quantity 标签的值。
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130 Id: 3, Name: Product 3, Price: 24.59, Quantity: 350 Id: 4, Name: Product 4, Price: 9.9, Quantity: 650 Id: 5, Name: Product 5, Price: 45, Quantity: 290
使用 ElementTree 修改 XML
以下示例演示了如何使用 ElementTree 修改 XML 文档。
import xml.etree.ElementTree as ET
# XML data
xml_data = """
<products>
<product>
<id>1</id>
<name>Product 1</name>
<price>10.99</price>
<quantity>30</quantity>
</product>
<product>
<id>2</id>
<name>Product 2</name>
<price>20.99</price>
<quantity>130</quantity>
</product>
</products>
"""
# Parse the XML data
root = ET.fromstring(xml_data)
# Modify the first product's price
first_product = root.find('product')
first_product.find('price').text = '15.99'
# Add a new product
new_product = ET.Element('product')
ET.SubElement(new_product, 'id').text = '3'
ET.SubElement(new_product, 'name').text = 'Product 3'
ET.SubElement(new_product, 'price').text = '30.99'
ET.SubElement(new_product, 'quantity').text = '200'
root.append(new_product)
# Print the modified XML
print(ET.tostring(root, encoding='unicode'))
在此程序中,使用 find 方法定位第一个 product 元素,并修改其 price。使用 ET.Element 和 ET.SubElement 创建新的 product 元素,并将其附加到根元素。使用 ET.tostring 打印修改后的 XML。
读取带有 id 属性的 XML 文件
以下示例演示了如何读取一个 XML 文件,其中每个 product 元素都具有 id 属性。该程序提取 id 属性以及 name、price 和 quantity 的值。
<products>
<product id="1">
<name>Product 1</name>
<price>10.99</price>
<quantity>30</quantity>
</product>
<product id="2">
<id>2</id>
<name>Product 2</name>
<price>20.99</price>
<quantity>130</quantity>
</product>
<product id="3">
<name>Product 3</name>
<price>24.59</price>
<quantity>350</quantity>
</product>
<product id="4">
<name>Product 4</name>
<price>9.9</price>
<quantity>650</quantity>
</product>
<product id="5">
<name>Product 5</name>
<price>45</price>
<quantity>290</quantity>
</product>
</products>
我们的产品 id 是作为属性存在的。
import xml.etree.ElementTree as ET
file_name = 'products.xml'
tree = ET.parse(file_name)
root = tree.getroot()
# Iterate over product elements
for product in root.findall('product'):
# Extract the id attribute
product_id = product.get('id')
name = product.find('name').text
price = product.find('price').text
quantity = product.find('quantity').text
print(f"Id: {product_id}, Name: {name}, Price: {price}, Quantity: {quantity}")
tree = ET.parse(file_name) root = tree.getroot()
我们使用 parse 方法解析文档,并使用 getroot 方法获取文档的根。
product_id = product.get('id')
name = product.find('name').text
price = product.find('price').text
quantity = product.find('quantity').text
使用 get 方法从每个 product 元素提取 id 属性。使用 find 方法提取 name、price 和 quantity 的值。
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130 Id: 3, Name: Product 3, Price: 24.59, Quantity: 350 Id: 4, Name: Product 4, Price: 9.9, Quantity: 650 Id: 5, Name: Product 5, Price: 45, Quantity: 290
使用 ElementTree 编写 XML
以下示例演示了如何使用 ElementTree 创建和编写 XML 文档。
import xml.etree.ElementTree as ET
# Create the root element
root = ET.Element('products')
# Create product elements
product1 = ET.SubElement(root, 'product')
ET.SubElement(product1, 'id').text = '1'
ET.SubElement(product1, 'name').text = 'Product 1'
ET.SubElement(product1, 'price').text = '10.99'
ET.SubElement(product1, 'quantity').text = '30'
product2 = ET.SubElement(root, 'product')
ET.SubElement(product2, 'id').text = '2'
ET.SubElement(product2, 'name').text = 'Product 2'
ET.SubElement(product2, 'price').text = '20.99'
ET.SubElement(product2, 'quantity').text = '130'
# Function to pretty-print XML
def prettify(element, level=0):
indent = ' '
if len(element):
if not element.text or not element.text.strip():
element.text = '\n' + indent * (level + 1)
for elem in element:
prettify(elem, level + 1)
if not elem.tail or not elem.tail.strip():
elem.tail = '\n' + indent * (level + 1)
if not elem.tail or not elem.tail.strip():
elem.tail = '\n' + indent * level
else:
if level and (not element.tail or not element.tail.strip()):
element.tail = '\n' + indent * level
return element
# Pretty-print the XML
pretty_root = prettify(root)
# Create an ElementTree object
tree = ET.ElementTree(pretty_root)
# Write the pretty-printed XML to a file
tree.write('products2.xml', encoding='utf-8', xml_declaration=True)
print("XML file created successfully with proper indentation.")
在此程序中,使用 ET.Element 和 ET.SubElement 函数创建 XML 结构。使用 tree.write 方法将 XML 数据写入文件。
使用 prettify 函数对 XML 数据进行整齐的缩进。
来源
在本文中,我们展示了如何在 Python 中使用 ElementTree 模块进行 XML 解析、修改和创建。ElementTree 模块是处理 XML 数据的强大工具。
作者
列出所有 Python 教程。