跳至主要内容

XML 文件处理

XML Files Handling in Python

Python 中的 XML 文件允许操纵和解析 XML 数据。XML (可扩展标记语言) 是一种广泛使用的数据交换格式。

使用 Python 打开 XML 文件并读取数据

要使用 Python 从 XML 文件中读取数据,可以使用内置的 XML 解析器模块。在这一部分,我们将学习如何通过探索流行的 Python 库来解析 Python 中的 XML 数据。

用于解析 XML 文件的最常用的库是 lxmlElementTree

使用 lxml 库

lxml 库是一个流行的 XML 文件读取器,它对于解析 XML 数据非常有效。可以使用 pip 命令安装 lxml 库。

from lxml import etree

root = etree.parse('file.xml')
for elem in root.iter():
    print(elem.tag, elem.text)

使用 ElementTree

ElementTree 是一个内置库,允许解析 XML 文件。使用 ElementTree 时,会附带内置的 模块,这些模块允许解析和创建元素。要使用 ElementTree 库,需要 import 它。

以下是如何使用 ElementTree 解析 XML 文件的一个示例

import xml.etree.ElementTree as ET

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

for elem in root:
    print(elem.tag, elem.text)

通过使用这些方法中的任何一种,都可以有效地读取 XML 文件。

如何编写 XML

要在 Python 中编写 XML,可以使用 ElementTree XML API 库。以下两个代码示例演示如何创建和编写 XML

示例 1:在 Python 中创建和编写 XML

import xml.etree.cElementTree as ET

### Create XML element tree

root = ET.Element("Person")
name = ET.SubElement(root, "Name")
name.text = "John"
age = ET.SubElement(root, "Age")
age.text = "30"

### Write XML element tree to file

tree = ET.ElementTree(root)
tree.write("person.xml")

示例 2:创建和编写带有属性的 XML

import xml.etree.cElementTree as ET

### Create XML element tree with attributes
 
root = ET.Element("Person", {"id": "123"})
name = ET.SubElement(root, "Name")
name.text = "Jane"
age = ET.SubElement(root, "Age")
age.text = "25"

### Write XML element tree to file  with custom formatting

tree = ET.ElementTree(root)
tree.write("person.xml", encoding="utf-8", xml_declaration=True)

在这两个示例中,ElementTree() 类用于创建一个 XML 元素 tree。然后使用 write() 方法将元素 tree 写入 XML 文件。通过在第二个示例中指定 encoding 和 xml_declaration,将创建一个自定义格式的 XML 文件,并在顶部添加 XML 声明。

如何将 XML 转换为 JSON

将 XML 转换为 JSON 是一项常见的任务,可以轻松实现。

xmltodict 模块允许我们将 XML 文档转换为字典,然后可以使用内置的 json 模块轻松地将其转换为 JSON。以下是一个示例代码片段,演示如何使用此方法

import xmltodict
import json

# Load XML file
with open('data.xml') as xml_file:
    xml_data = xml_file.read()

# Convert XML to Python dictionary
dict_data = xmltodict.parse(xml_data)

# Convert dictionary to JSON
json_data = json.dumps(dict_data)

# Output JSON data
print(json_data)

xml.etree.ElementTree 模块允许我们解析 XML 文档并创建一个 Element 对象,可以遍历该对象以获取所需数据。一旦我们以字典形式获得数据,就可以使用 json 模块将其转换为 JSON。以下是一个示例代码片段,演示如何使用此方法

import xml.etree.ElementTree as ET
import json

# Load XML file
tree = ET.parse('data.xml')
root = tree.getroot()

# Traverse the Element object to get required data
xml_dict = {}
for child in root:
    xml_dict[child.tag] = child.text

# Convert dictionary to JSON
json_data = json.dumps(xml_dict)

# Output JSON data
print(json_data)

如何将 XML 转换为 CSV

要将 XML 转换为 CSV,可以使用 xml.etree.ElementTree 模块和 csv 模块。以下两个代码示例可帮助你入门

示例 1:使用 ElementTree 和 CSV 模块

import csv
import xml.etree.ElementTree as ET

### Open the XML file

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

### Open the CSV file

csv_file = open('example.csv', 'w')
csvwriter = csv.writer(csv_file)

### Write the column headers

header = []
for child in root[0]:
    header.append(child.tag)
csvwriter.writerow(header)

### Write the data rows

for item in root.findall('.//item'):
    row = []
    for child in item:
        row.append(child.text)
    csvwriter.writerow(row)

### Close the CSV file

csv_file.close()

示例 2:使用 pandas

import pandas as pd
import xml.etree.ElementTree as ET

### Load the XML file into a dataframe

tree = ET.parse('example.xml')
root = tree.getroot()
dfcols = ['name', 'email', 'phone']
df = pd.DataFrame(columns=dfcols)

for node in root: 
    name = node.find('name').text
    email = node.find('email').text
    phone = node.find('phone').text

    df = df.append(
        pd.Series([name, email, phone], index=dfcols),
        ignore_index=True)

### Save the dataframe to a CSV file

df.to_csv('example.csv', index=False)

在这两个示例中,xml.etree.ElementTree 模块用于解析 XML 文件和提取数据。csv 模块(在示例 1 中)或 pandas 库(在示例 2 中)用于将数据写入 CSV 文件。

与我们一起贡献!

不要犹豫,在 GitHub 上为 Python 教程做出贡献:创建 fork,更新内容并发出 pull 请求。

Profile picture for user AliaksandrSumich
Python 工程师,第三方 Web 服务集成专家。
Profile picture for user almargit
更新:05/03/2024 - 21:52
Profile picture for user angarsky
已审阅并批准