什么是 XML?
XML(可扩展标记语言,Extensible Markup Language)是一种用于表示和传输数据的标记语言。它被设计用来以一种结构化的形式描述文档的内容,并且具有良好的跨平台和跨语言的特性。XML使用标签来定义数据的结构,并可以通过自定义标签来适应各种不同的应用领域。
XML的主要特点包括:
- 可扩展性:XML允许用户自定义标签,因此可以根据不同需求灵活扩展和定义数据结构。
- 适应性:XML可以用于描述各种不同类型的数据,包括文本、图像、音频、视频等多媒体数据。
- 平台无关性:XML是一种纯文本格式,不依赖于任何特定的硬件或软件平台。
- 易于阅读和编写:XML文档使用标签进行结构化表示,使其易于人类阅读和编辑。
- 广泛应用:XML在诸如Web服务(Web Services)、配置文件、数据交换等领域得到广泛应用。
通常,在XML中,数据以标签(tag)的形式包裹,并且可以使用属性(attributes)来提供更多的信息。下面是一个简单的XML示例:
<person><name>John Doe</name><age>30</age><gender>Male</gender>
</person>
这段XML描述了一个人员信息,包括姓名、年龄和性别。XML的灵活性和通用性使其成为数据交换、配置文件、Web服务等领域中常用的数据表示格式。
Python 对 XML 的解析方案
常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。
Python 有三种方法解析 XML:ElementTree、SAX 以及 DOM。
-
ElementTree
xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块,它提供了简单而高效的 API,用于解析和生成 XML 文档。 -
SAX (simple API for XML )
Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。 -
DOM(Document Object Model)
将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。
后面用到的实例文件:
<collection shelf="New Arrivals">
<movie title="Enemy Behind"><type>War, Thriller</type><format>DVD</format><year>2003</year><rating>PG</rating><stars>10</stars><description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers"><type>Anime, Science Fiction</type><format>DVD</format><year>1989</year><rating>R</rating><stars>8</stars><description>A schientific fiction</description>
</movie><movie title="Trigun"><type>Anime, Action</type><format>DVD</format><episodes>4</episodes><rating>PG</rating><stars>10</stars><description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar"><type>Comedy</type><format>VHS</format><rating>PG</rating><stars>2</stars><description>Viewable boredom</description>
</movie>
</collection>
Python 使用 ElementTree 解析 xml
xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块。
以下是 xml.etree.ElementTree 模块的一些关键概念和用法:
ElementTree 和 Element 对象:
- ElementTree: ElementTree 类是 XML 文档的树形表示。它包含一个或多个 Element 对象,代表整个 XML 文档。
- Element: Element 对象是 XML 文档中元素的表示。每个元素都有一个标签、一组属性和零个或多个子元素。
接下来,让我们分步进行解释:
解析 XML
首先,需要导入 ElementTree 模块,并使用 ET.parse()
方法加载 XML 文件。
本例中文件名为 example.xml
。
使用 ET.parse()
方法加载 XML 文件,并使用 getroot()
方法获取 XML 树的根元素 root
。
import xml.etree.ElementTree as ETtree = ET.parse('example.xml')
root = tree.getroot()
遍历 XML 树
要遍历 XML 树,可以使用循环来遍历子元素。每个元素都有标签名 (tag
)、属性 (attrib
) 和文本内容 (text
)。
for movie in root.findall('movie'):title = movie.get('title')print(f"Movie title: {title}")description = movie.find('description').textprint(f"Description: {description}")format = movie.find('format').textprint(f"Format: {format}")
在上面的示例中,使用 findall('movie')
方法遍历所有 movie
元素。然后,我们使用 get('title')
获取电影的标题属性,以及 find('description').text
获取描述子元素的文本内容,以及格式等。
访问元素属性和文本
- 使用
get('attr_name')
方法来访问元素的属性。 - 使用
find('subelement')
方法来获取子元素,然后使用.text
属性来获取子元素的文本内容。
创建 XML 元素
要创建新的 XML 元素,可以使用 ET.SubElement()
方法,并将其附加到父元素中。
new_movie = ET.SubElement(root, 'movie')
new_movie.set('title', 'New Movie Title')new_description = ET.SubElement(new_movie, 'description')
new_description.text = 'Exciting new movie'
上面的例子中,我们创建了一个新的 movie
元素,并设置了它的标题属性和描述子元素的文本内容。
修改和删除 XML 元素
要修改现有元素的属性或文本内容,只需直接对相应的属性进行赋值操作即可。要删除元素,可以使用 remove()
方法。
# 修改元素属性
movie.set('title', 'New Title')# 修改子元素文本内容
description.text = 'New description'# 删除元素
root.remove(movie)
简单读取 XML 内容:
import xml.etree.ElementTree as ET# 定义一个 XML 字符串
xml_string = '''
<bookstore><book><title>Introduction to Python</title><author>John Doe</author><price>29.99</price></book><book><title>Data Science with Python</title><author>Jane Smith</author><price>39.95</price></book>
</bookstore>
'''# 使用 ElementTree 解析 XML 字符串
root = ET.fromstring(xml_string)# 遍历 XML 树
for book in root.findall('book'):title = book.find('title').textauthor = book.find('author').textprice = book.find('price').textprint(f'Title: {title}, Author: {author}, Price: {price}')
以上代码执行输出结果为:
Title: Introduction to Python, Author: John Doe, Price: 29.99
Title: Data Science with Python, Author: Jane Smith, Price: 39.95
Python 使用 SAX 解析 xml
SAX 是一种基于事件驱动的API。
利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。
解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。
- 对大型文件进行处理;
- 只需要文件的部分内容,或者只需从文件中得到特定信息。
- 想建立自己的对象模型的时候。
在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍
使用xml.dom解析xml
ContentHandler
类是 Python 的 xml.sax
模块中定义的一个标准接口,用于处理 XML 文档的内容。下面是常用的 ContentHandler
类方法、参数和简要介绍,以及配合示例:
方法介绍与参数:
-
startDocument()
- 参数:无
- 介绍:开始解析文档时调用,用于初始化解析状态。
def startDocument(self):print("Start parsing document")
-
endDocument()
- 参数:无
- 介绍:结束解析文档时调用,用于清理解析过程中占用的资源。
def endDocument(self):print("End parsing document")
-
startElement(tag, attributes)
- 参数:
tag
表示元素标签名,attributes
是一个字典类型,包含了元素的属性。 - 介绍:遇到 XML 元素的开始标签时调用,用于处理元素的开始部分。
- 参数:
def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)
-
endElement(tag)
- 参数:
tag
表示元素标签名。 - 介绍:遇到 XML 元素的结束标签时调用,用于处理元素的结束部分。
- 参数:
def endElement(self, tag):print(f"End element: {tag}")
-
characters(content)
- 参数:
content
是元素内的字符数据(文本内容)。 - 介绍:用于处理元素内的字符数据。
- 参数:
def characters(self, content):print("Character data:", content)
make_parser
, parser
和 parseString
都是与 XML 解析相关的函数或类,通常用于解析和处理 XML 数据。下面是它们的简要介绍:
-
xml.sax.make_parser()
xml.sax.make_parser()
函数用于创建并返回一个新的 SAX 解析器对象。- 示例:
import xml.sax parser = xml.sax.make_parser()
-
parser
parser
是由xml.sax.make_parser()
创建的 SAX 解析器对象。它可以通过调用其他方法和设置内容处理器来实现 XML 数据的解析和处理。- 示例:
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
-
parseString()
- 在针对 XML 字符串进行解析时使用的方法。它是
xml.sax
模块中xml.sax.parseString()
的同义词。 - 示例:
xml_string = "<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>" parser = xml.sax.make_parser() handler = MyContentHandler() parser.setContentHandler(handler) parser.parseString(xml_string)
- 在针对 XML 字符串进行解析时使用的方法。它是
这些函数和方法都是 xml.sax
模块中用于解析 XML 的一部分。通过使用它们,可以有效地处理和操作 XML 数据。
示例代码:
import xml.saxclass MyContentHandler(xml.sax.ContentHandler):def startDocument(self):print("Start parsing document")def endDocument(self):print("End parsing document")def startElement(self, tag, attributes):print(f"Start element: {tag}")if attributes:print("Attributes:", attributes)def endElement(self, tag):print(f"End element: {tag}")def characters(self, content):print("Character data:", content)# 创建 XML 解析器对象
parser = xml.sax.make_parser()
# 关闭命名空间处理
parser.setFeature(xml.sax.handler.feature_namespaces, 0)# 设置内容处理器
content_handler = MyContentHandler()
parser.setContentHandler(content_handler)# 解析 XML 文件
xml_file = "example.xml"
with open(xml_file, "r") as file:parser.parse(file)
以上示例展示了如何创建一个自定义的 ContentHandler
类 MyContentHandler
并使用它来解析 XML 文件。在这个例子中,我们重写了 startDocument()
、endDocument()
、startElement()
、endElement()
和 characters()
方法来处理不同类型的事件和内容。
使用xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
#!/usr/bin/python3from xml.dom.minidom import parse
import xml.dom.minidom# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):print ("Root element : %s" % collection.getAttribute("shelf"))# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息
for movie in movies:print ("*****Movie*****")if movie.hasAttribute("title"):print ("Title: %s" % movie.getAttribute("title"))type = movie.getElementsByTagName('type')[0]print ("Type: %s" % type.childNodes[0].data)format = movie.getElementsByTagName('format')[0]print ("Format: %s" % format.childNodes[0].data)rating = movie.getElementsByTagName('rating')[0]print ("Rating: %s" % rating.childNodes[0].data)description = movie.getElementsByTagName('description')[0]print ("Description: %s" % description.childNodes[0].data)
结果:
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
关注我,不迷路,共学习,同进步
关注我,不迷路,共学习,同进步