Python通过DOM和SAX方式解析XML的应用实例分享
什么是XML?
XML是一种用于存储和传输数据的标准格式,其全称为Extensible Markup Language(可拓展标记语言)。XML与HTML类似,也是一种标记语言,但XML数据的表示和标记与HTML有很大不同,XML更加灵活和可扩展。
XML解析方式
XML解析指的是将XML数据转换为可操作的对象或数据结构。Python支持两种主要的XML解析方式:DOM(文档对象模型)和SAX(简单API for XML)。
DOM解析
DOM解析是将整个XML文档读入内存,并将其转换为树形结构存储在内存中,这种解析方式适用于需要操作整个XML文档的情况。Python内置的xml.dom模块提供了DOM解析器,可以轻松地进行DOM解析。
以下是DOM解析的示例:
import xml.dom.minidom
# 加载XML文件
dom = xml.dom.minidom.parse('example.xml')
# 查找根元素
root = dom.documentElement
# 查找子元素
first_child = root.childNodes[0]
# 打印子元素的文本内容
print(first_child.firstChild.data)
SAX解析
SAX解析是将XML文档按顺序解析,并通过事件通知应用程序读取XML文档中的数据,这种解析方式适用于大型XML文档。Python内置的xml.sax模块提供了SAX解析器,可以轻松地进行SAX解析。
以下是SAX解析的示例:
import xml.sax
# 定义事件处理器
class ExampleHandler(xml.sax.ContentHandler):
def startElement(self, name, attrs):
print('Element start: ', name)
def endElement(self, name):
print('Element end: ', name)
def characters(self, content):
print('Element content: ', content)
# 创建SAX解析器并解析XML
parser = xml.sax.make_parser()
parser.setContentHandler(ExampleHandler())
parser.parse('example.xml')
示例说明
下面将以两个具体的XML文档为例,分别演示DOM和SAX的解析方式,以及如何使用Python操作它们。
示例1:books.xml
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<price>44.95</price>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<price>5.95</price>
</book>
</catalog>
DOM解析
import xml.dom.minidom
# 加载XML文件
dom = xml.dom.minidom.parse('books.xml')
# 查找根元素
root = dom.documentElement
# 查找所有book元素
books = root.getElementsByTagName('book')
# 打印每本书的信息
for book in books:
# 获取book元素的id属性
book_id = book.getAttribute('id')
# 获取book元素的子元素
author = book.getElementsByTagName('author')[0].firstChild.data
title = book.getElementsByTagName('title')[0].firstChild.data
price = book.getElementsByTagName('price')[0].firstChild.data
# 打印书的信息
print('Book ID:', book_id)
print('Author:', author)
print('Title:', title)
print('Price:', price)
print('---')
输出结果:
Book ID: bk101
Author: Gambardella, Matthew
Title: XML Developer's Guide
Price: 44.95
---
Book ID: bk102
Author: Ralls, Kim
Title: Midnight Rain
Price: 5.95
---
SAX解析
import xml.sax
# 定义事件处理器
class ExampleHandler(xml.sax.ContentHandler):
def __init__(self):
self.current_element = ''
self.current_book_id = ''
self.current_author = ''
self.current_title = ''
self.current_price = ''
def startElement(self, name, attrs):
self.current_element = name
if name == 'book':
self.current_book_id = attrs['id']
def endElement(self, name):
self.current_element = ''
if name == 'book':
# 打印书的信息
print('Book ID:', self.current_book_id)
print('Author:', self.current_author)
print('Title:', self.current_title)
print('Price:', self.current_price)
print('---')
# 重置当前书的信息
self.current_book_id = ''
self.current_author = ''
self.current_title = ''
self.current_price = ''
def characters(self, content):
if self.current_element == 'author':
self.current_author = content
elif self.current_element == 'title':
self.current_title = content
elif self.current_element == 'price':
self.current_price = content
# 创建SAX解析器并解析XML
parser = xml.sax.make_parser()
parser.setContentHandler(ExampleHandler())
parser.parse('books.xml')
输出结果:
Book ID: bk101
Author: Gambardella, Matthew
Title: XML Developer's Guide
Price: 44.95
---
Book ID: bk102
Author: Ralls, Kim
Title: Midnight Rain
Price: 5.95
---
示例2:students.xml
<?xml version="1.0"?>
<students>
<student id="001">
<name>Bob</name>
<age>18</age>
<gender>Male</gender>
</student>
<student id="002">
<name>Alice</name>
<age>19</age>
<gender>Female</gender>
</student>
</students>
DOM解析
import xml.dom.minidom
# 加载XML文件
dom = xml.dom.minidom.parse('students.xml')
# 查找根元素
root = dom.documentElement
# 查找所有student元素
students = root.getElementsByTagName('student')
# 打印每个学生的信息
for student in students:
# 获取student元素的id属性
student_id = student.getAttribute('id')
# 获取student元素的子元素
name = student.getElementsByTagName('name')[0].firstChild.data
age = student.getElementsByTagName('age')[0].firstChild.data
gender = student.getElementsByTagName('gender')[0].firstChild.data
# 打印学生的信息
print('Student ID:', student_id)
print('Name:', name)
print('Age:', age)
print('Gender:', gender)
print('---')
输出结果:
Student ID: 001
Name: Bob
Age: 18
Gender: Male
---
Student ID: 002
Name: Alice
Age: 19
Gender: Female
---
SAX解析
import xml.sax
# 定义事件处理器
class ExampleHandler(xml.sax.ContentHandler):
def __init__(self):
self.current_element = ''
self.current_student_id = ''
self.current_name = ''
self.current_age = ''
self.current_gender = ''
def startElement(self, name, attrs):
self.current_element = name
if name == 'student':
self.current_student_id = attrs['id']
def endElement(self, name):
self.current_element = ''
if name == 'student':
# 打印学生的信息
print('Student ID:', self.current_student_id)
print('Name:', self.current_name)
print('Age:', self.current_age)
print('Gender:', self.current_gender)
print('---')
# 重置当前学生的信息
self.current_student_id = ''
self.current_name = ''
self.current_age = ''
self.current_gender = ''
def characters(self, content):
if self.current_element == 'name':
self.current_name = content
elif self.current_element == 'age':
self.current_age = content
elif self.current_element == 'gender':
self.current_gender = content
# 创建SAX解析器并解析XML
parser = xml.sax.make_parser()
parser.setContentHandler(ExampleHandler())
parser.parse('students.xml')
输出结果:
Student ID: 001
Name: Bob
Age: 18
Gender: Male
---
Student ID: 002
Name: Alice
Age: 19
Gender: Female
---
上述示例是针对较小的XML文档进行的演示,对于较大的XML文档,使用SAX解析方式能够更加高效。同时,DOM解析方式提供的树形结构也方便对整个XML文档进行操作,具体使用方式需按照需求选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python通过DOM和SAX方式解析XML的应用实例分享 - Python技术站