Python 解析XML文件

  • Post category:Python

当需要处理XML形式的数据时,Python提供了许多解析工具,例如ElementTree, lxml等等。在这里,我们将重点介绍Python中自带的ElementTree模块的使用方法。

1. 解析XML

1.1 读取XML文件

首先,需要使用ElementTree模块中的parse()方法来读取XML文件,并将其存储在一个Element对象中。示例代码如下:

import xml.etree.ElementTree as ET

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

在上面的代码中,我们首先导入了ElementTree模块,然后使用parse()方法读取了名为”example.xml”的文件,并将其存储在tree对象中。接着,我们使用getroot()方法获取了整个XML文档的根节点,并将其存储在了root对象中。

1.2 获取节点的属性和值

在读取了XML文件后,我们可以使用Element对象的一些方法来获取节点的属性和值。例如,我们可以使用Element对象的attrib属性获取节点的属性,使用text属性获取节点的值。示例代码如下:

for child in root:
    print('Tag:', child.tag, 'Attrib:', child.attrib, 'Value:', child.text)

上面的代码中,使用了一个for循环遍历了根节点下的所有节点,分别获取了节点的标签名、属性、以及值。

1.3 查找节点

接下来,我们可以使用Element对象的find()和findall()方法来查找XML文件中的节点。首先,find()方法返回文档中第一个匹配给定标记名称的元素,而findall()方法则返回文档中所有匹配的元素。示例代码如下:

# 查找第一个匹配的country节点
country = root.find('country')
print(country.attrib)

# 查找所有匹配的neighbor节点,并打印其值
for neighbor in root.findall('country/neighbor'):
    print(neighbor.text)

上面的代码中,我们首先使用find()方法查找了XML文件中第一个匹配的country节点,并打印了其属性。接着,使用findall()方法查找了所有匹配的邻居节点,并打印了其值。

2. 创建XML

在使用Python处理XML时,我们还可以创建XML文件。在Python中,可以使用Element对象的一些方法来创建XML文件。下面,我们将介绍如何使用Element对象创建XML文件。

2.1 创建XML根节点

首先,我们需要使用Element()方法来创建一个节点,并将其作为根节点。示例代码如下:

import xml.etree.ElementTree as ET

root = ET.Element('root')
tree = ET.ElementTree(root)

在上面的代码中,我们首先使用Element()方法创建了一个节点,节点的标记名为’root’。接着,我们使用ElementTree()方法将其作为根节点,存储在tree对象中。

2.2 创建子节点

接下来,我们可以使用Element对象的SubElement()方法来创建子节点。例如,我们可以创建一个名为’country’的子节点,并为其添加一个名为’name’的属性和一个值。示例代码如下:

country = ET.SubElement(root, 'country')
country.set('name', 'China')

在上面的代码中,我们使用SubElement()方法创建了一个名为’country’的子节点,并将其作为根节点的子节点。然后,我们使用set()方法为’country’节点添加一个名为’name’的属性,属性值为’China’。

2.3 添加子节点的子节点

除了添加子节点外,我们还可以添加子节点的子节点。例如,我们可以添加一个名为’rank’的子节点,并将其作为’country’节点的子节点。示例代码如下:

rank = ET.SubElement(country, 'rank')
rank.text = '2'

在上面的代码中,我们首先使用SubElement()方法创建了一个名为’rank’的子节点,并将其作为’country’节点的子节点。然后,我们为’rank’节点的text属性设置了一个值’2’。

2.4 保存XML文件

最后,我们需要使用ElementTree对象的write()方法将创建的XML文件保存到磁盘中。示例代码如下:

tree.write('example.xml')

在上面的代码中,我们使用write()方法将XML文件保存到磁盘中,文件名为’example.xml’。

示例

下面,我们将给出两个完整的示例,介绍如何使用Python解析XML文件。

示例1:解析XML文件

XML文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<CATALOG>
   <CD>
      <TITLE>Empire Burlesque</TITLE>
      <ARTIST>Bob Dylan</ARTIST>
      <COUNTRY>USA</COUNTRY>
      <COMPANY>Columbia</COMPANY>
      <PRICE>10.90</PRICE>
      <YEAR>1985</YEAR>
   </CD>
   <CD>
      <TITLE>Hide your heart</TITLE>
      <ARTIST>Bonnie Tyler</ARTIST>
      <COUNTRY>UK</COUNTRY>
      <COMPANY>CBS Records</COMPANY>
      <PRICE>9.90</PRICE>
      <YEAR>1988</YEAR>
   </CD>
</CATALOG>

解析代码如下:

import xml.etree.ElementTree as ET

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

# 遍历XML文件并输出每个CD的属性和值
for cd in root.findall('CD'):
    for child in cd:
        print(child.tag, child.text)

输出结果如下:

TITLE Empire Burlesque
ARTIST Bob Dylan
COUNTRY USA
COMPANY Columbia
PRICE 10.90
YEAR 1985
TITLE Hide your heart
ARTIST Bonnie Tyler
COUNTRY UK
COMPANY CBS Records
PRICE 9.90
YEAR 1988

示例2:创建XML文件

创建代码如下:

import xml.etree.ElementTree as ET

# 创建根节点
root = ET.Element('catalog')
tree = ET.ElementTree(root)

# 创建子节点及其属性、值
cd = ET.SubElement(root, 'CD')
title = ET.SubElement(cd, 'TITLE')
title.text = 'Empire Burlesque'
artist = ET.SubElement(cd, 'ARTIST')
artist.text = 'Bob Dylan'
country = ET.SubElement(cd, 'COUNTRY')
country.text = 'USA'
company = ET.SubElement(cd, 'COMPANY')
company.text = 'Columbia'
price = ET.SubElement(cd, 'PRICE')
price.text = '10.90'
year = ET.SubElement(cd, 'YEAR')
year.text = '1985'

# 保存XML文件
tree.write('catalog.xml')

创建的XML文件内容与示例1中的相同。