08 Python进阶:XML 解析

什么是 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。

  1. ElementTree
    xml.etree.ElementTree 是 Python 标准库中用于处理 XML 的模块,它提供了简单而高效的 API,用于解析和生成 XML 文档。

  2. SAX (simple API for XML )
    Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析 XML 的过程中触发一个个的事件并调用用户定义的回调函数来处理 XML 文件。

  3. 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 ET

tree = 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').text
    print(f"Description: {description}")

    format = movie.find('format').text
    print(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').text
    author = book.find('author').text
    price = book.find('price').text
    print(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 数据进行处理。

  1. 对大型文件进行处理;
  2. 只需要文件的部分内容,或者只需从文件中得到特定信息。
  3. 想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍

使用xml.dom解析xml

ContentHandler 类是 Python 的 xml.sax 模块中定义的一个标准接口,用于处理 XML 文档的内容。下面是常用的 ContentHandler 类方法、参数和简要介绍,以及配合示例:

方法介绍与参数:

  1. startDocument()

    • 参数:无
    • 介绍:开始解析文档时调用,用于初始化解析状态。
def startDocument(self):
    print("Start parsing document")
  1. endDocument()

    • 参数:无
    • 介绍:结束解析文档时调用,用于清理解析过程中占用的资源。
def endDocument(self):
    print("End parsing document")
  1. startElement(tag, attributes)

    • 参数:tag 表示元素标签名,attributes 是一个字典类型,包含了元素的属性。
    • 介绍:遇到 XML 元素的开始标签时调用,用于处理元素的开始部分。
def startElement(self, tag, attributes):
    print(f"Start element: {tag}")
    if attributes:
        print("Attributes:", attributes)
  1. endElement(tag)

    • 参数:tag 表示元素标签名。
    • 介绍:遇到 XML 元素的结束标签时调用,用于处理元素的结束部分。
def endElement(self, tag):
    print(f"End element: {tag}")
  1. characters(content)

    • 参数:content 是元素内的字符数据(文本内容)。
    • 介绍:用于处理元素内的字符数据。
def characters(self, content):
    print("Character data:", content)

make_parser, parserparseString 都是与 XML 解析相关的函数或类,通常用于解析和处理 XML 数据。下面是它们的简要介绍:

  1. xml.sax.make_parser()

    • xml.sax.make_parser() 函数用于创建并返回一个新的 SAX 解析器对象。
    • 示例:
      import xml.sax
      parser = xml.sax.make_parser()
      
  2. parser

    • parser 是由 xml.sax.make_parser() 创建的 SAX 解析器对象。它可以通过调用其他方法和设置内容处理器来实现 XML 数据的解析和处理。
    • 示例:
      parser.setFeature(xml.sax.handler.feature_namespaces, 0)
      
  3. 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.sax 模块中用于解析 XML 的一部分。通过使用它们,可以有效地处理和操作 XML 数据。

示例代码:

import xml.sax

class 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)

以上示例展示了如何创建一个自定义的 ContentHandlerMyContentHandler 并使用它来解析 XML 文件。在这个例子中,我们重写了 startDocument()endDocument()startElement()endElement()characters() 方法来处理不同类型的事件和内容。

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

#!/usr/bin/python3

from 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

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于 elf loader 的编写

可以使用如下命令观看 elf 文件的信息 readelf -a build/ramdisk.img | vim -在编写 elf loader 的时候&#xff0c;实际上只有下图这一部分 “Program Headers” 是有用的 凡是类型为 “LOAD” 的就是需要加载进内存的部分 所以&#xff0c;只要把这些部分加载进内存里&…

晶核2024搬砖职业推荐!

在晶核手游的广袤世界中&#xff0c;选择一位适合自己的搬砖角色是每位玩家都必须认真考虑的事情。不同的职业拥有独特的技能和特点&#xff0c;能够在搬砖过程中发挥不同的优势。下面&#xff0c;我们将深入探讨晶核搬砖的四大利器&#xff0c;让你对每个角色有更深入的了解&a…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了&#xff1a; Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏&#xff0c;无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版&#xff0c;https://www.32r.com/soft/38404.html 安装后打开就gg了&#xff1a; 表现…

计算机中数的表示

0. 简介 介绍计算机中数的表示方法&#xff0c;主要内容来自 c s a p p csapp csapp。 1. 整数的表示 包括有符号整数与无符号整数的表示。 假设 w → [ w n − 1 w n − 2 . . . w 0 ] \overrightarrow w[w_{n-1}w_{n-2}...w_0] w [wn−1​wn−2​...w0​] 为一种整数。…

Allavsoft for Mac v3.27.0.8852注册激活版 优秀的视频下载工具

Allavsoft for Mac是一款功能强大的多媒体下载和转换工具&#xff0c;支持从各种在线视频网站和流媒体服务下载视频、音频和图片。它具备批量下载和转换功能&#xff0c;可将文件转换为多种格式&#xff0c;以适应不同设备的播放需求。此外&#xff0c;Allavsoft还提供视频编辑…

windows下部署mongoDB

目录 1. 下载zip安装包并解压&#xff1a;Download MongoDB Community Server | MongoDB 2. 在解压后的文件夹中新建文件夹data及下级文件夹db和log 3. 新建一个mongod.cfg文件&#xff0c;并配置以下内容 4. 在cmd中启动mongodb&#xff0c;并进行验证 5. 部署到本地服务器…

亚信安慧AntDB:打造智慧生态的数据心脏

AntDB的“融合实时”的特性&#xff0c;不仅使得数据库具备了更强大的适应性&#xff0c;更让企业在不同业务场景下能够更好地实现业务目标&#xff0c;释放出更大的商业价值。融合实时的特性让AntDB具有了高度灵活性和实时性&#xff0c;使其能够满足企业在不同业务需求下的快…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号混知近2000篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

uni-app如何实现高性能

这篇文章主要讲解uni-app如何实现高性能的问题&#xff1f; 什么是uni-app&#xff1f; 简单说一下什么是uni-app&#xff0c;uni-app是继承自vue.js&#xff0c;对vue做了轻度定制&#xff0c;并且实现了完整的组件化开发&#xff0c;并且支持多端发布的一种架构&#xff0c…

【Java EE】初识Spring Web MVC

文章目录 &#x1f334;什么是Spring Web MVC&#xff1f;&#x1f338;什么是Servlet呢? &#x1f332;MVC 定义&#x1f338;再理解Spring MVC &#x1f333;如何学习Spring MVC呢&#xff1f;⭕总结 &#x1f334;什么是Spring Web MVC&#xff1f; Spring Web MVC 是基于…

【Linux】使用cloudreve搭建个人网盘并传输文件

Cloudreve 是一个开源的个人网盘系统&#xff0c;能够帮助用户搭建属于自己的私有云存储服务。它支持多种存储后端&#xff0c;包括本地存储、远程FTP/SFTP存储、以及云存储服务如阿里云OSS、腾讯云COS和Amazon S3等。Cloudreve具有友好的用户界面和丰富的功能&#xff0c;比如…

揭秘rmallox病毒:防范、清除、恢复一步到位!

引言&#xff1a; 随着信息技术的快速发展&#xff0c;计算机病毒已成为网络安全领域的一大难题。其中&#xff0c;rmallox病毒是近年来备受关注的一种恶意软件。本文将深入探讨rmallox病毒的特性、传播途径、防范措施、清除方法以及数据恢复技巧&#xff0c;帮助读者全面了解这…

创新指南|涵盖创新管理的一系列终极指南

毫无疑问&#xff0c;创新是过去几十年来最热门的流行语和最具争议的话题之一&#xff0c;尽管很多人已经厌倦了到处听到它&#xff0c;但这个术语和概念它的后面就留在这里。由于这已被证明是无休止的争论来源&#xff0c;因此我们决定创建一系列涵盖创新管理的博客文章&#…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…

红黑树平衡艺术:最大化与最小化红色结点比值的策略与实现

红黑树平衡艺术&#xff1a;最大化与最小化红色结点比值的策略与实现 一、 最大比值的红黑树构造1.1 伪代码示例&#xff1a;1.2 C代码示例&#xff1a; 三、最小比值的红黑树构造3.1 伪代码示例&#xff1a;3.2 C代码示例&#xff1a; 四、结论 红黑树是一种自平衡的二叉搜索树…

动态多目标优化:动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、进化动态约束多目标优化测试集DCP1-DCP9 参考文献&#xff1a; [1]G. Chen, Y. Guo, Y. Wang, J. Liang, D. Gong and S. Yang, “Evolutionary Dynamic Constrained Multiobjective Optimization: Test Suite and Algorithm,” in IEEE Transactions on Evolutionary Com…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

【Linux】UDP编程{诸多编程接口/三版本服务器/编程常见问题}

文章目录 0.预备知识0.1套接字0.2TCP/UDP0.3大小端问题 1.socket 常见API1.1socket1.2各个接口1.3int bind();1.3网络头文件四件套1.4bzero1.5recvfrom1.6sendto() 2.UDP编程2.1服务器编程2.2客户端编程2.3运行测试2.3.1本机通信2.3.2popen2.3.3strcasestr2.3.4回顾C11智能指针…

Ubuntu20.04配置Kinect 2.0驱动安装和ROS环境下配置以及录制bag包和制作ORB-SLAM数据集

1. 安装libfreenect2 1.1 下载官方文件 git clone https://github.com/OpenKinect/libfreenect2.git cd libfreenect21.2 安装build工具 sudo apt-get install build-essential cmake pkg-config1.3 安装libusb sudo apt-get install libusb-1.0-0-dev1.4 安装urboJPEG su…

如何客观评价5G的现状?

前几天&#xff0c;在知乎上看到一个帖子&#xff0c;热度挺高&#xff1a; 看了一下帖子的回答&#xff0c;基本上都在骂5G。 作为通信行业从业者&#xff0c;我说说我自己的看法。大家姑且听听&#xff0c;一起交流一下。 我们目前所处的这个时代&#xff0c;有一个很大的特点…